android viewpager change adapter

拈花ヽ惹草 提交于 2019-12-03 11:33:23

问题


I'm developing an app with a ViewPager for lateral scrolling tables, sometimes i need to change the adapter to load a different set of tables. I've tried to do the following:

mViewPager.setAdapter(new pagerAdapterPushed(getSupportFragmentManager()));
mViewPager.getAdapter().notifyDataSetChanged();
indicator.setViewPager(mViewPager);
indicator.invalidate();
mViewPager.invalidate();

but it always reload the previous data. Isn't it possibile to change the adapter of a ViewPager?


回答1:


Exactly like my APP doing...

For change ViewPagerAdapter, what I did is :

  1. Clear all Fragments inside current adapter
  2. Set current adapter to null
  3. Assign new adpater for ViewPager

    /* Clear all Fragments inside current adapter */
    public class MyPagerAdapter extends FragmentPagerAdapter
    {
      private ArrayList<Fragment> fragments=new ArrayList<Fragment>();
      //...some stuff
    
      public void clearAll() //Clear all page
      {
        for(int i=0; i<fragments.size(); i++)
        fragMan.beginTransaction().remove(fragments.get(i)).commit();
        fragments.clear();
      }
    }
    
    /* Set current adapter to null */
    Constants.VP.removeAllViews();
    Constants.VP.setAdapter(null);
    
    /* Assign new adpater for ViewPager */
    Constants.PAGER=new MyewPagerAdapter(getSupportFragmentManager());
    Constants.VP.setAdapter(Constants.PAGER);
    

Hope it helps~




回答2:


You need to override public int getItemPosition (Object object) in pager adapter. For every element in the viewpager, you need to return POSITION_UNCHANGED (if it is still in the pager) or POSITION_NONE (if it was removed). Otherwise the view pager won't know something has changed. I wouldn't recommend setting a new adapter, just clearing out the data in the old one.




回答3:


I see that @RRTW way worked for some people but it did not do the trick for me (although it was close). Without 'commitNow()' instead of regular 'commit()' it would not work properly. I did something like that:

    private fun changePagerAdapter(newAdapter: PagerAdapter) {
    val transaction = supportFragmentManager.beginTransaction()
    supportFragmentManager.fragments.forEach {
        transaction.remove(it)
    }
    transaction.commitNow()
    view_pager.adapter = newAdapter
}



回答4:


I found a very simple option, I do not know if it's right or wrong, but you can just re-set the adapter

mViewPager.setAdapter(mSectionsPagerAdapter);

It's example for google example project Tabbed Activity for button FloatingActionButton




回答5:


Add this to view pager to reload for next fragment:

viewPager.setCurrentItem()


来源:https://stackoverflow.com/questions/12783571/android-viewpager-change-adapter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!