- 浏览: 687257 次
- 性别:
- 来自: 苏州
最新评论
-
usedlie:
if (flag) { matrix.set(matrix ...
android view的缩放平移简单实现 -
jin290:
简单 快捷 非常棒 可以直接用
android 应用实现微信好友或朋友圈分享 -
貌似掉线:
0是朋友1是朋友圈
android 应用实现微信好友或朋友圈分享 -
zhangzhanlei:
[color=red][/color]
android 应用实现微信好友或朋友圈分享 -
shizhangliao:
android适配多分辨率的小技巧
【转】详解ViewPager调用FragmentPagerAdapter.notifyDataSetChanged()不能更新Fragment
- 博客分类:
- Android
- Android Tips
转载自
http://www.blog4app.com/?p=62
我的问题:fragment展示网络down下来的图品,列表由一张图到多张的时候使用
能解决问题
但是列表图片只有一张,需要更新为另外一张的时候,不行
,则需要重载
感谢原博客博主不吝分享
第一部分:现象出现的原因
代码默认实现如此。
FragmentPagerAdapter调用notifyDataSetChanged后,执行mObservable.notifyChanged()。mObservable对象的初始化,是在ViewPager调用setAdapter时被赋值的,对应的类叫PagerObserver。PagerObserver的dataSetChanged方法如下:
PagerAdapter的默认getItemPosition实现是 return POSITION_UNCHANGED。所以调用notifyDataSetChanged方法不会刷新Fragment。
第二部分:解决办法
为了让Fragment重新绘制,必须重载FragmentPagerAdapter的getItemPositon方法并修改为return POSITION_NONE。这样之前所有的Fragment都会被detach掉。
如果你按上面的步骤做了,而且调用notifyDataSetChanged时候,list数据位空,那么结果是你希望看到的。但是如果list的数据在原有的基础上做了修改,但是结果你看到的Fragment上显示的信息还是之前的数据。
第三部分:Fragment不刷新的原因
如第二部分描述,旧的Fragment都会被detach掉,但是它并没有被distory掉,而是被保存下来了,保存时候存储的tag来源如下代码:
刷新后调用FragmentPagerAdapgter的instantiateItem方法,会通过findFragmentByTag找到被detach掉的Fragment,然后再执行该Fragemnt的attach方法,最后再次执行Fragment的生命周期,所以你看到的Fragment上面的数据还是老数据。
第四部分:解决办法
如第三部分描述,如果Fragment你是通过getItem方法中去new一个Fragment出来,然后数据通过setArgument设置进去的。那么再次执行改Fragment的attach方法后,拿到的数据还是老数据。解决版本就是在instantiateItem方法中调用Fragment的自定义方法resetFragmentData(),把旧数据替换掉。注:resetFragmentData只能做数据替换,不能直接更新view,View的更新还是在调用attach方法后继续执行到onActivityCreated方法后执行刷新View。
http://www.blog4app.com/?p=62
我的问题:fragment展示网络down下来的图品,列表由一张图到多张的时候使用
@Override public int getItemPosition(Object object) { return POSITION_NONE; }
能解决问题
但是列表图片只有一张,需要更新为另外一张的时候,不行
,则需要重载
public Object instantiateItem(ViewGroup container, int position)更新fragment中的数据来实现了
感谢原博客博主不吝分享
第一部分:现象出现的原因
代码默认实现如此。
FragmentPagerAdapter调用notifyDataSetChanged后,执行mObservable.notifyChanged()。mObservable对象的初始化,是在ViewPager调用setAdapter时被赋值的,对应的类叫PagerObserver。PagerObserver的dataSetChanged方法如下:
for (int i = 0; i < mItems.size(); i++) { final ItemInfo ii = mItems.get(i); final int newPos = mAdapter.getItemPosition(ii.object); if (newPos == PagerAdapter.POSITION_UNCHANGED) { continue; } if (newPos == PagerAdapter.POSITION_NONE) { mItems.remove(i); i--; if (!isUpdating) { mAdapter.startUpdate(this); isUpdating = true; } mAdapter.destroyItem(this, ii.position, ii.object); needPopulate = true; if (mCurItem == ii.position) { // Keep the current item in the valid range newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1)); needPopulate = true; } continue; } if (ii.position != newPos) { if (ii.position == mCurItem) { // Our current item changed position. Follow it. newCurrItem = newPos; } ii.position = newPos; needPopulate = true; } }
PagerAdapter的默认getItemPosition实现是 return POSITION_UNCHANGED。所以调用notifyDataSetChanged方法不会刷新Fragment。
第二部分:解决办法
为了让Fragment重新绘制,必须重载FragmentPagerAdapter的getItemPositon方法并修改为return POSITION_NONE。这样之前所有的Fragment都会被detach掉。
@Override public int getItemPosition(Object object) { return POSITION_NONE; }
如果你按上面的步骤做了,而且调用notifyDataSetChanged时候,list数据位空,那么结果是你希望看到的。但是如果list的数据在原有的基础上做了修改,但是结果你看到的Fragment上显示的信息还是之前的数据。
第三部分:Fragment不刷新的原因
如第二部分描述,旧的Fragment都会被detach掉,但是它并没有被distory掉,而是被保存下来了,保存时候存储的tag来源如下代码:
private static String makeFragmentName(int viewId, long id) { return "android:switcher:" + viewId + ":" + id; }
刷新后调用FragmentPagerAdapgter的instantiateItem方法,会通过findFragmentByTag找到被detach掉的Fragment,然后再执行该Fragemnt的attach方法,最后再次执行Fragment的生命周期,所以你看到的Fragment上面的数据还是老数据。
第四部分:解决办法
如第三部分描述,如果Fragment你是通过getItem方法中去new一个Fragment出来,然后数据通过setArgument设置进去的。那么再次执行改Fragment的attach方法后,拿到的数据还是老数据。解决版本就是在instantiateItem方法中调用Fragment的自定义方法resetFragmentData(),把旧数据替换掉。注:resetFragmentData只能做数据替换,不能直接更新view,View的更新还是在调用attach方法后继续执行到onActivityCreated方法后执行刷新View。
public class CarTypeListAdapter extends FragmentPagerAdapter { private final ArrayList<CarTypeListMinPriceResult.CarTypeMinPrice> mRecList; protected ImageWorker mImageFetcher; public CarTypeListAdapter(FragmentManager fm, ArrayList<CarTypeListMinPriceResult.CarTypeMinPrice> recList, ImageWorker worker) { super(fm); this.mRecList = recList; this.mImageFetcher = worker; } @Override public Fragment getItem(int position) { CarTypeInfoFragment imageFragment = CarTypeInfoFragment.newInstance(mRecList.get(position), mImageFetcher); return imageFragment; } public Object instantiateItem(ViewGroup container, int position) { CarTypeInfoFragment f = (CarTypeInfoFragment)super.instantiateItem(container, position); if(!QArrays.isEmpty(mRecList) && position >=0 && position < mRecList.size()){ CarTypeListMinPriceResult.CarTypeMinPrice p = mRecList.get(position); if(p != null){ f.resetFragmentData(p); } } return f; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public int getCount() { return mRecList == null ? 0 : mRecList.size(); } }
发表评论
-
WebStorm导入React_Native项目,配置相关的Tips
2016-10-13 17:08 2868WebStorm激活相关 WebStorm下载地址:http ... -
android 清空之前task中的activity
2016-09-29 14:15 3888开发过程有个场景:关闭之前所有activity,跳转到登录页 ... -
jar包混淆
2016-09-18 16:46 1059开发过程中需要把相关功能打成jar包供别人调用,如果不混淆的话 ... -
项目从eclipse移植到studio中遇到的问题整理
2016-09-13 17:42 1125概念 eclipse workspace ---> ... -
ViewGroup&View&Activity onInterceptTouchEvent&dispatchTouchEvent&onTouch整理
2016-08-03 22:26 620一直对这块的知识一知 ... -
仿京东android客户端收件地址选择
2016-07-12 18:07 6458纯手写,可能有些问题,功能已实现 activity pac ... -
FragmentActivity中资源被回收,导致页面fragment错乱的问题
2016-06-07 13:59 3784开发过程中,页面使用fragmentactivity,可能会遇 ... -
android 通过eclipse mat来监测应用内存
2016-02-03 13:02 011dasdasdas -
startActivityForResult常用使用方式
2015-04-24 11:58 1667示例 初始Activity启动目标activity,并带上了请 ... -
在android4.4以上版本 第三方应用处理短信的疑惑
2015-03-31 16:14 969最近有个处理android手机短信的需求,需要删除本地某指定短 ... -
ListView添加headview或者footview时onItemClick事件数组越界的问题
2014-11-20 09:32 1586项目中Listview需要添加headview以及footvi ... -
Beacon的入门相关知识整理(关于android开发)
2014-10-27 16:53 0To do.... -
[转]常用Github项目类库
2014-09-18 09:29 1739【转自】http://blog.csdn.net/jabony ... -
android适配多分辨率的小技巧
2014-09-05 18:10 2749android多分辨率适配其实是老生常谈的话了,今天再拿出来炒 ... -
【转】详解android:scaleType属性
2014-08-28 10:48 868android:scaleType是控制图片如何resized ... -
android通过自定义schame和host来启动app
2014-08-15 15:02 2102很多时候,我们可以看到在web页面中点击链接,可以直接启动ap ... -
基础知识整理
2014-08-08 17:50 0onTouch(MotionEvent event) eve ... -
android view的缩放平移简单实现
2014-07-22 16:20 16311参考了下网上一些实现 主要是通过matrix实现的 用到的 ... -
android 应用实现微信好友或朋友圈分享
2014-07-18 16:44 60374官方的文档连接:https://open.weixin.qq. ... -
android 自定义view支持gif格式播放
2014-07-16 18:38 4102前段时间做了个项目,有播放gif的需求, 而android展示 ...
相关推荐
ViewPager中使用FragmentPagerAdapter.notifyDataSetChanged无法更新当前Fragment解决方案
Fragment ViewPager actionBar FragmentPagerAdapter ActionBar.Tab
ViewPager使用中notifyDataSetChanged无法更新问题解决
Android高级应用源码-viewpager+Fragment.rar
Android高级应用源码-viewpager+Fragment.zip
两个ViewPager嵌套问题.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
viewpager 和 fragment
安卓开发-引导界面viewPager.zip.zip
ViewPager切换界面.rar
ViewPager滑动效果.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
viewpager指示器.zip项目安卓应用源码下载viewpager指示器.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
ViewPager + FragmentPagerAdapter
安卓开发-超炫丽viewpager用户引导.zip.zip
超炫丽viewpager用户引导.zip项目安卓应用源码下载超炫丽viewpager用户引导.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
超炫丽viewpager用户引导.rar
小程序源码 viewpager指示器.zip
Android 超炫丽viewpager用户引导.zip
超炫丽viewpager用户引导.zip安卓程序项目源码资源下载超炫丽viewpager用户引导.zip安卓程序项目源码资源下载 1.适合学生做毕业设计用 2.适合程序员学习研究用 3.适合小公司换皮做新项目用