在使用ViewPager+FragmentPagerAdapter时候,更新Fragment里数据是不起做用,FragmentPagerAdapter添加或减小Fragment时,前面的Fragment内容更新不起做用等等问题,有的作法是暴力删除fragment列表,如java
List<Fragment> fragments = getSupportFragmentManager().getFragments(); for (int i = fragments.size() - 1; i >= 0; i--) { getSupportFragmentManager().beginTransaction().remove(fragments.get(0)); }
也有作法是重写FragmentPagerAdapter的instantiateItem(ViewGroup container, int position)方法等等,有效虽有效,但比较粗爆。ide
FragmentPagerAdapter.getItem(int position)在更新时候不必定会被调用,因此Fragment更新是无效,来看看FragmentPagerAdapter的父类PagerAdapter中的代码instantiateItemspa
FragmentPagerAdapter里在根据getItemId(int position)来判断当前position里Fragment是否存在,若是存在,则不会建立亦不会更新,那么要让FragmentPagerAdapter的更新生效,那在getItemId(int)里根据数据返回一个惟一的数据ID,当FragmentPagerAdapter更新时,数据ID改变了,那么Fragment就会调用getItem(int)去获取新Fragment,达到更新效果code
@Override public long getItemId(int position) { // 获取当前数据的hashCode int hashCode = mData.get(position).hashCode(); return hashCode; }