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

原文地址

今天工作中遇到了这个纠结的问题,在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;
         }

 


 

二。较通用的解决方案

 

       所谓通用的方案,即对于任何ViewPager中的View都可以进行数据更新,具体的方法是每当Adapter调用instantiateItem时,运用View.setTag方法将该View标识。当需要更新这个View的数据时,通过调用ViewPager.findViewWithTag方法找到相应的View,然后更新View中的数据。不能空说不练,最后给上关键代码,领会精神。

java]  view plain  copy
 print ?
  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. }  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值