http://blog.csdn.net/wangyuetingtao/article/details/12140509
http://blog.csdn.net/leo8573/article/details/7893841
http://www.cnblogs.com/dancefire/archive/2013/01/02/why-notifyDataSetChanged-does-not-work.html
今天工作中遇到了这个纠结的问题,在ViewPager中调用PagerAdapter.notifyDataSetChanged()方法,好像没有任何作用,相应的View也没有更新数据,根据官方API是这样解释的:大概是说明Adapter会自动管辖ViewPager每一页(Item)的状态,而notifyDataSetChanged()是用在当Vie Pager要新增一页、刪除一页或改变各个页面的排列的時候。所以ViewPager Adapter的notifyDataSetChanged自然就不适用于只更新View
Pager里面某个View的內容的需求。对此查阅后终于得到了一个相对稳定的解决方案,Mark一下。
一、一种简单的解决方案
这种方案我相信只要是对ViewPager数据更新问题有研究的都会了解,即覆盖PagerAdapter中的getItemPosition()方法,这种方案虽然简单,但是因为这种方法是让每次呼叫PagerAdapter时,都会遍历childView,通过getItemPosition()方法返回Item位置失去的参数,这样PagerAdapter误认为Item失去位置,因而重新建立所有childView,这样做来,开销过大,而且由于占用了getItemPosition()方法,也不适用于复杂的View界面,只适合TextView,EditText等简单的View。
覆盖代码:
public int getItemPosition(Object object){
return POSITION_NONE;
}
二、PagerAdapter的工作机制
这里所说的工作机制,严格意义上讲就是PagerAdapter的执行顺序,也是Leo8573通过调试自己理解的。
PagerAdapter作为ViewPager的适配器,无论ViewPager有多少页,PagerAdapter在初始化时也只初始化开始的2个View,即调用2次instantiateItem方法。而接下来每当ViewPager滑动时,PagerAdapter都会调用destroyItem方法将距离该页2个步幅以上的那个View销毁,以此保证PagerAdapter最多只管辖3个View,且当前View是3个中的中间一个,如果当前View缺少两边的View,那么就instantiateItem,如里有超过2个步幅的就destroyItem。
简易图示:
*
------+---+---+---+------
... 0 | 1 | 2| 3 | 4 ...
------+---+---+---+------
当前View为2号View,所以PagerAdapter管辖1、2、3三个View,接下来向左滑动-->
*
------+---+---+---+------
... 1 | 2 | 3 | 4 | 5 ...
------+---+---+---+------
滑动后,当前View变为3号View,PagerAdapter会destroyItem 0号View,instantiateItem 5号View,所以PagerAdapter管辖2、3、4三个View
大概就是这样,各位领会精神吧,Leo8573文字表达能力还是有点差。
三、较通用的解决方案
所谓通用的方案,即对于任何ViewPager中的View都可以进行数据更新,具体的方法是每当Adapter调用instantiateItem时,运用View.setTag方法将该View标识。当需要更新这个View的数据时,通过调用ViewPager.findViewWithTag方法找到相应的View,然后更新View中的数据。不能空说不练,最后给上关键代码,领会精神。
代码示例:
-
@OverridepublicObjectinstantiateItem(ViewGroupcontainer,intposition){
-
Viewview=null;
-
view=mInflater.inflate(R.layout.record_list_layout,null);
-
TextViewtvRecord=(TextView)view.findViewById(R.id.tv_record);
-
Stringkey="tvRecord"+position;
-
-
tvRecord.setTag(key);
-
container.addView(view)
-
returnview;}
-
-
-
TextViewtvRecord=myViewPager.findViewWithTag("tvRecord1");
-
-
-
if(tvRecord!=null){tvRecord.setText("update");
-
}
-
}
上是自己查阅信息后的小体会,不对的地方请各位朋友指正,Leo8573鞠躬下台。
分享到:
相关推荐
viewpager + PagerAdapter刷新数据
viewpager+fragment 动态更新数据
ViewPager使用中notifyDataSetChanged无法更新问题解决
通过ViewPager动态加载View里面的数据
不用编写ViewPager适配器! 使用Android数据绑定框架将您的ViewPager连接到您的数据模型。 提供Kotlin支持!
android ViewPager动态加载数据
Java文件,Activity,ViewPager,Fragment和TabLayout数据传递
ViewPagerDemo两个viewpager重合问题,这个问题有时候有些头疼,app主页很常见,事件分发机制
Android实现ViewPager中item之间的数据通信
重写了子viewpager的方法,...解决了父viewpager不能滑动或者子viewpager不能滑动问题。修改了事件的分发。可以使子viewpager滑动到最后一页后直接滑入父viewpager的fragment。修改子viewpager可参考local.xml 。
Android ViewPager 小示例
滑动选择的画廊效果,中间大,两边小并且有阴影
这是一个实现了ViewPager左右滑动动态加载的Demo,滑到最左边也可以再加载数据到左边
完美解决解决viewpager嵌套viewpager,子viewpager轮播白屏的问题,顺带解决viewpager懒加载,自定义listview上拉加载等等问题。 网络下载用了universal-image-loader框架。自己做项目遇到问题,网上demo一直不可用...
ViewPager + Fragment小Demo
Viewpager+Fragment实现滑动结束后加载数据,类似于微信的加载方式
把viewpager+listview做成了一个工具类,方便调用。实现Page竖排显示并滑动。方便动态加载数据。
viewpager+fragment左右滑动实现动态加载数据。动态刷新fragment
viewpager 动态加载数据,左右滑动加载,已测试通过
当ViewPager 嵌套时,子ViewPager,不能优先处理滑动事件。 玩一下 网易新闻 ...此Demo完美解决ViewPager嵌套的滑动问题,但快速滑动父ViewPager,再滑动ViewPager还是被父ViewPager处理了,正常操作,都是正常的。