Android FragmentStatePagerAdapter

android, android-fragments, fragmentpageradapter

Solution

I have implemented something similar to what you have. I extended the `FragmentPagerAdapter` class like so:

public class ContactsFragmentPagerAdapter extends FragmentPagerAdapter {
    ActionBar mActionBar;
    private List<Fragment> mFragments;

    public ContactsFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        mFragments = fragments;
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    public void setActionBar(ActionBar bar) {
        mActionBar = bar;
    }
}

Notice I have added an argument to the constructor to pass in the `List` of `Fragment` objects. This way the `getItem()` method of this class can return any class that extends `Fragment` or any of its subclasses and not just one specific class `ArrayListFragment` like you have done.

In the `Activity` where I instantiate my subclass of `FragmentPagerAdapter` I have passed in the list of `Fragment` objects:

Class the instantiates the FragmentPagerAdapter

public final class ContactManager extends Activity {
    private ContactsFragmentPagerAdapter mAdapter;
    private ViewPager mPager;
    public ActionBar mActionBar;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.contact_manager);

        List<Fragment> fragments = new Vector<Fragment>();
        fragments.add(Fragment.instantiate(this, ContactsListFragment.class.getName()));
        fragments.add(Fragment.instantiate(this, GroupsListFragment.class.getName()));
        mAdapter = new ContactsFragmentPagerAdapter(this.getFragmentManager(), fragments);

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageScrollStateChanged(int arg0) {}

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

            @Override
            public void onPageSelected(int arg0) {
                mActionBar.getTabAt(arg0).select();
            }
        });

    }

}

By accessing the variable "fragments", you can access a previously created `Fragment` so that you can run methods of that `Fragment`.

Problem

I'm working with a FragmentStatePagerAdapter using this example. The MyAdapter class is implemented as follows: ``` public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return ArrayListFragment.newInstance(position); } } ``` The ListFragment class includes the following method to create a new instance: ``` /** * Create a new instance of CountingFragment, providing "num" * as an argument. */ static ArrayListFragment newInstance(int num) { ArrayListFragment f = new ArrayListFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } ``` When I create a new fragment state pager adapter in my activity, `getItem` is called, which in turn calls the `newInstance` method in the ListFragment class. This is great when I want to create a new fragment. But it's not clear to me how to modify `getItem` (if even needed) to get the fragment object when it already exists and the user pages from, for example, page 2 to page 1. I'd like my Activity to retrieve that existing, previously created fragment so that it can run an inner class `AsyncMethod`, which resides in the fragment class.

Original source

Related problems