Search code examples
androidandroid-fragmentsandroid-viewpagerandroid-pageradapter

How do you notify a PagerAdapter that the fragments have changed when the count is the same?


I have built an application with a navbar on the left, whose main content is a ViewPager

The ViewPager slides between two different views.

When the user selects something from the navgation bar, I send a message to the ViewPager's adapter (I have tried both FragmentPagerAdapter and FragmentStatePagerAdapter for this, both won't work) which sets an internal variable and calls notifyDatasetChanged();

The problem is that the getCount() method always returns 2 , so when the adapter checks to see if the dataset has changed, it sees that the items are still 2 and does not go on to call getItem(position).

The getItem(position) returns different fragments according to the value of the internal variable that is set before notifyDatasetChanged();

I tried overriding getItemId(position) in case the pager checks for the id, but it seems to not bother after checking the count.

Is there a way to force the adapter to rebuild the fragments when notifyDatasetChanged() is called?

Thanks in advance for any help you can provide

Edit: here is the code I am currently using:

public class ContentAdapter extends FragmentPagerAdapter {

    private ViewedSection _section = ViewedSection.Main;

    public ContentAdapter(FragmentManager fm) {
        super(fm);
    }
    @Override
    public Fragment getItem(int position) {
        ViewedScreen screen = get_screen(position);
        return screen == null ? null : FragmentFactory.GetFragment(get_screen(position));
}

    @Override
    public int getCount() {
        return 2;
    }

    private ViewedScreen get_screen(int position) {
    //code to resolve which screen will be shown according to the current position and _section
    }

    public void set_page(ViewedSection section) {
        this._section = section;
        notifyDataSetChanged();
    }
} 

So when the user clicks on a NavBar item, I call ((ContentAdapter)_pager.getAdapter()).set_page(section);


Solution

  • For this, you need to override

        public int getItemPosition (Object object)
    

    Return POSITION_UNCHANGED if you don't want to replace the fragment. Return POSITION_NONE if you want to replace the fragment. (Also, you can return a new position to move the fragment to.)

    A common override is

        public int getItemPosition (Object object) {
            return POSITION_NONE;
        }
    

    which will just rebuild everything.