关于ViewPager的数据更新问题小结

转载 2015年07月08日 10:18:05

http://blog.csdn.net/wangyuetingtao/article/details/12140509


http://blog.csdn.net/leo8573/article/details/7893841


为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?

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中的数据。不能空说不练,最后给上关键代码,领会精神。

 

代码示例:

[java] view plaincopy
  1. @Overridepublic Object instantiateItem(ViewGroup container, int position) {  
  2.     View view = null;  
  3.     view = mInflater.inflate(R.layout.record_list_layout, null);  
  4.     TextView tvRecord = (TextView) view.findViewById(R.id.tv_record);  
  5.     String key = "tvRecord" + position;     
  6. // 關鍵點,針對要更新的View來設定Tag,主要是在後續使用ViewPager.findViewWithTag()時,可以找到要更新的View  
  7.     tvRecord.setTag(key);  
  8.     container.addView(view)  
  9.     return view;}    
  10.   
  11. // 在後續的應用當中,如果要開始更新View Pager當中某個View的內容時,需要進行下列動作  
  12.      TextView tvRecord = myViewPager.findViewWithTag("tvRecord1");   
  13. // 假設要更新第2頁的TextView   
  14. // 進行內容更新  
  15.      if (tvRecord != null ) {    tvRecord.setText("update");  
  16.     } /* end of if */  
  17. }  

关于ViewPager的数据更新问题小结

http://blog.csdn.net/leo8573/article/details/7893841 今天工作中遇到了这个纠结的问题,在ViewPager中调用PagerAdapter.not...
  • fancylovejava
  • fancylovejava
  • 2013年12月26日 21:31
  • 33456

Viewpager+fragment数据更新问题解析

在一个 Android 应用中,我们可以使用 FragmentPageAdapter 来处理多 Fragment 页面的横向滑动。但是当 Fragment 对应的数据集发生改变时,我们都希望能够通过...
  • Buaaroid
  • Buaaroid
  • 2016年04月12日 14:32
  • 1979

PagerSlidingTabStrip关联viewpager时,viewpager上fragment切换时保持数据状态,以及viewpager默认缓存的去除

一:布局文件为: com.ddhealer.nidmall.view.PagerSlidingTabStrip android:layout_marginLeft="13dp" ...
  • liulinghuidage
  • liulinghuidage
  • 2016年07月28日 09:10
  • 1312

关于ViewPager的数据更新问题小结

今天工作中遇到了这个纠结的问题,在ViewPager中调用PagerAdapter.notifyDataSetChanged()方法,好像没有任何作用,相应的View也没有更新数据,根据官方API是这...
  • leo8573
  • leo8573
  • 2012年08月22日 01:13
  • 12199

Fragment与ViewPager之间更新数据相关问题

上网的时候碰到一篇绝世好文,特此记录一下: http://www.cnblogs.com/dancefire/archive/2013/01/02/why-notifydatasetchanged-...
  • csd_xuming
  • csd_xuming
  • 2015年06月13日 00:03
  • 2731

关于ViewPager的数据更新问题小结

http://blog.csdn.net/leo8573/article/details/7893841 今天工作中遇到了这个纠结的问题,在ViewPager中调用PagerAdapter.not...
  • fancylovejava
  • fancylovejava
  • 2013年12月26日 21:31
  • 33456

ViewPager+Fragment切换时无法更新数据问题解析(源代码分享)

在一个 Android 应用中,我们可以使用 FragmentPageAdapter 来处理多 Fragment 页面的横向滑动。但是当 Fragment 对应的数据集发生改变时,我们都希望能够通过调...
  • u013900875
  • u013900875
  • 2014年07月28日 16:24
  • 5519

关于ViewPager的数据更新问题小结

http://blog.csdn.net/fancylovejava/article/details/17592731 http://blog.csdn.net/wangyuetingtao...
  • qiaoqiaodidaqiang
  • qiaoqiaodidaqiang
  • 2015年02月13日 09:24
  • 731

Viewpager+fragment数据更新问题

最近做东西发现了一个问题,用viewPager加载Fragment,无法通过notifyDataSetChanged()进行更新,o(╯□╰)o很是郁闷。所以就研究了一番,以下是成果,分享一下 Pag...
  • shadow066
  • shadow066
  • 2013年12月13日 11:06
  • 13387

ViewPager 更新数据的问题

今天工作中遇到了这个纠结的问题,在ViewPager中调用PagerAdapter.notifyDataSetChanged()方法,好像没有任何作用,相应的View也没有更新数据,根据官方API是这...
  • god2030
  • god2030
  • 2016年04月13日 09:42
  • 252
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于ViewPager的数据更新问题小结
举报原因:
原因补充:

(最多只允许输入30个字)