Search code examples
androidlistandroid-fragmentsandroid-fragmentactivityandroid-listfragment

How to combine a ListFragment with a normal Fragment in a FragmentActivity?


How can you combine a ListFragment with normal Fragments? My application works if I use just Fragments, but if I change one of the Fragments into a ListFragment the application stops when I run it even though there are no errors given.

My FragmentActivity:

     package com.example.tabswithswipe;

     import com.example.tabswithswipe.R;
     import your_package_name.adapter.TabsPagerAdapter;
     import android.os.Bundle;
     import android.app.ActionBar;
     import android.app.ActionBar.Tab;
     import android.app.FragmentTransaction;
     import android.support.v4.app.FragmentActivity;
     import android.support.v4.view.ViewPager;
     import android.view.Menu;

     public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Top Rated", "Games", "Movies" };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialization
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}



@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());
}



@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}

}

My TabbsPagerAdapter:

     package your_package_name.adapter;

     import android.support.v4.app.Fragment;
     import android.support.v4.app.FragmentManager;
     import android.support.v4.app.FragmentPagerAdapter;
     import android.support.v4.app.ListFragment;

     public class TabsPagerAdapter extends FragmentPagerAdapter {

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        // Top Rated fragment activity
        return new NewUser();
    case 1:
        // Games fragment activity
        return new MyListFragment();
    case 2:
        // Movies fragment activity
        return new MoviesFragment();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

  }

My ListFragment:

    package your_package_name.adapter;

    import android.os.Bundle;
    import android.support.v4.app.ListFragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    public class MyListFragment extends ListFragment {

     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
       super.onActivityCreated(savedInstanceState);
       String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
    "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
    "Linux", "OS/2" };
       ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
    android.R.layout.simple_list_item_1, values);
       setListAdapter(adapter);
     }

     @Override
     public void onListItemClick(ListView l, View v, int position, long id) {
       // do something with the data
     }

@Override   
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(android.R.layout.simple_list_item_1, container, false);
    return rootView;


}



}

Solution

  • A ListFragment is just a wrapper around Fragment but has already a ListView ready for you to use.

    This would do the trick:

    public class MyListFragment extends ListFragment {
    
        @Override   
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
            "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
            "Linux", "OS/2" };
    
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, values);
    
            setListAdapter(adapter);
    
            return super.onCreateView(inflater,container,savedInstanceState);
        }
    
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
          // do something with the data
        }
    }