Android FragmentPagerAdapter数据刷新notifyDataSetChanged没效果研究
2016-03-23 14:36
639 查看
当你更新里fragment List集合后调用fragmentpageadpater的notifyDataSetChanged方法时发现数据根本就没有刷新。网络上会提到pageadapter的刷新方案如下代码:
复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
// Do we already have this fragment?
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 void setFragments(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数据刷新(亲测有效)。
复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
结果你发现是刷新了一下但内容还是原始的数据。通过对fragmentpageadapter的源码查看你会在instantiateItem方法里面发现这一段
// Do we already have this fragment?
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 void setFragments(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数据刷新(亲测有效)。
相关文章推荐
- android知识点汇总
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- Fragment详解(四)Fragment生命周期
- Android 截屏并保存
- Android安全专项-Apk加固
- Android 快速开发系列 打造万能的ListView GridView 适配器
- 举例讲解Android中ViewPager中的PagerTitleStrip子控件
- Fragment详解(三):创建Fragment
- Android SparseArray浅析
- Fragment详解(二):Fragment 与支持库
- Android开发下遇到的一些奇葩问题处理
- Fragment详解(一):Fragment简介
- Android_Scroller类_用法
- 【Android】【滑屏】scrollTo,scrollBy
- Android学习资源
- Android笔记:invalidate()和postInvalidate() 的区别及使用
- android Broadcast学习
- Android的shape
- DSS 流媒体服务器的搭建 Android端的读取
- Android解析自定义的链接的一些属性