Search code examples
androidtabsandroid-listfragment

Listview and Tabs


I want to create a list view under different tabs. This is what i did for FragmentA class.

public class FragmentA extends ListFragment {
String [] names = {"Theo","Theo","Theo","Theo","Theo"};
public FragmentA() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_a, container, false);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);



    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1,names);
    setListAdapter(adapter);
 }

}

I am creating a sample listview into the onActivityCreated method. Finally for the Tabs I am using the following code.

  public class MainActivity extends ActionBarActivity implements TabListener {
  ActionBar actionBar;
  ViewPager pager;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    pager = (ViewPager)findViewById(R.id.pager);
    pager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            // TODO Auto-generated method stub
            actionBar.setSelectedNavigationItem(arg0);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }
    });

     ActionBar.Tab tab1=actionBar.newTab();
     tab1.setText("Tab 1");
     tab1.setTabListener(this);

     ActionBar.Tab tab2=actionBar.newTab();
     tab2.setText("Tab 2");
     tab2.setTabListener(this);

     ActionBar.Tab tab3=actionBar.newTab();
     tab3.setText("Tab 3");
     tab3.setTabListener(this);

     actionBar.addTab(tab1);
     actionBar.addTab(tab2);
     actionBar.addTab(tab3);
   }

   @Override
   public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub

   }

  @Override
  public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub
    pager.setCurrentItem(arg0.getPosition());
 }

 @Override
public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
    // TODO Auto-generated method stub

  }
 }
   class MyAdapter extends FragmentPagerAdapter{

    public MyAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        Fragment fragment = null;
        if(arg0==0){
            fragment = new FragmentA();
        }
        if(arg0==1){
            fragment = new FragmentB();
        }
        if(arg0==2){
            fragment = new FragmentC();
        }
        return fragment;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 3;
    }

}

The compiler doesn't let me to run the app as it gives me the following error..

Type mismatch: cannot convert from FragmentA to Fragment
Change type of fragment to fragmentA.

If I comment the setListAdapter(adapter) in the FragmentA class, everything is fine. Why is this happening?


Solution

  • change:

    import android.app.ListFragment;
    

    to

    import android.support.v4.app.ListFragment;
    

    you used ListFragmentfrom API level 11 but you must used ListFragment from support library in order to work with viewpager. because it is FragmentManager also comes from support library(getSupportFragmentManager) so it dose not understand any fragment from other than its own library.