上周加今天都在调整一个问题:viewpager重新加载数据源,无法刷新,注意:这里说的并不是重新刷新viewpager中某个fragment 的数据,而是改变viewpager 的整体结构
最终在一位大神的指导下,终于找到问题。之前用的是FragmentPagerAdapter ,无论怎样notifyDataSetChanged 或者new 对象都无法解决,后来viewpager 的adapter 换了,换成了FragmentStatePagerAdapter,这样,再次notifyDataSetChanged就真的刷新成功了。这个具体的原因网上有说明,说的都比较深奥,我比较菜,看了半天也没看懂,像我们这种菜逼,只能先记住,看源码,有时间慢慢琢磨,慢慢来吧。。。
public class AdapterViewStatePager extends FragmentStatePagerAdapter { private int mChildCount = 0; private String[] title ; public void setTitle(String[] title) { this.title = title; } private ArrayList<FragmentBase> fragmentBases = new ArrayList<FragmentBase>();; public void setFragmentBases(ArrayList<FragmentBase> fragmentBases) { this.fragmentBases = fragmentBases; } @Override public void notifyDataSetChanged() { mChildCount = getCount(); super.notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { if ( mChildCount > 0) { mChildCount --; return POSITION_NONE; } return super.getItemPosition(object); } public AdapterViewStatePager(FragmentManager fragmentManager) { super(fragmentManager); } public AdapterViewStatePager(FragmentManager fragmentManager, ArrayList<FragmentBase> fragmentBases) { super(fragmentManager); this.fragmentBases = fragmentBases; } @Override public CharSequence getPageTitle(int position) { return title[position % title.length]; } @Override public Fragment getItem(int position) { return fragmentBases.get(position); } @Override public int getCount() { return fragmentBases.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); } }
调用:
adapterViewPager.setFragmentBases(fragmentBases); viewPager.setAdapter(adapterViewPager); viewPager.invalidate(); adapterViewPager.notifyDataSetChanged(); tabPageIndicator.setViewPager(viewPager); tabPageIndicator.notifyDataSetChanged(); tabPageIndicator.setCurrentItem(0);