FragmentPagerAdapter刷新notifyDataSetChanged无效

网络上会提到pageadapter的刷新方案如下代码:

复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。

<span style="font-size:18px;">@Override  
public int getItemPosition(Object object) { 
   return POSITION_NONE; 
}  </span>


结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
 
       String name =makeFragmentName(container.getId(), position);
       Fragment fragment =mFragmentManager.findFragmentByTag(name);
       if (fragment != null) {
           if (DEBUG)Log.v(TAG, "Attaching item #" + position + ": f=" +fragment);
          mCurTransaction.attach(fragment);
       } else {
           fragment =getItem(position);
           if (DEBUG)Log.v(TAG, "Adding item #" + position + ": f=" +fragment);
          mCurTransaction.add(container.getId(), fragment,
                 makeFragmentName(container.getId(),position));
       }


原来他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新的fragmentList集合是没有作用的,还要清除FragmentManager里面缓存的fragment。解决办法:在继承的fragmentpageadapter类里面添加这么一个方法

<span style="font-size:18px;">public voidsetFragments(ArrayList fragments) {
   if(this.fragments !=null){
     FragmentTransaction ft = fm.beginTransaction();
     for(Fragment f:this.fragments){
       ft.remove(f);
     }
     ft.commit();
     ft=null;
     fm.executePendingTransactions();
   }
  this.fragments = fragments;
  notifyDataSetChanged();
}</span>


就能完美的解决fragmentpageadapter数据刷新。

猜你喜欢

转载自blog.csdn.net/android_koukou/article/details/52447078