2025年FragmentPagerAdapter刷新notifyDataSetChanged无效

FragmentPagerAdapter刷新notifyDataSetChanged无效网络上会提到 pageadapter 的刷新方案如下代码 复写 pageradapter 的 getItemPosit 方法设置 tag 为 POSITION NONE 意思是没有找到 child 要求重新加载 Override public int getItemPosit Object object return POSITION NONE

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

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

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


结果你发现是刷新了一下但内容还是原始的数据。通过对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类里面添加这么一个方法

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();}

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

今天的文章 2025年FragmentPagerAdapter刷新notifyDataSetChanged无效分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-09-13 16:30
下一篇 2025-03-20 18:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/140511.html