关于ViewPager的数据更新问题小结
2016-07-09 22:56
555 查看
原文地址
今天工作中遇到了这个纠结的问题,在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?
@Overridepublic Object instantiateItem(ViewGroup container, int position) {
View view = null;
view = mInflater.inflate(R.layout.record_list_layout, null);
TextView tvRecord = (TextView) view.findViewById(R.id.tv_record);
String key = "tvRecord" + position;
// 關鍵點,針對要更新的View來設定Tag,主要是在後續使用ViewPager.findViewWithTag()時,可以找到要更新的View
tvRecord.setTag(key);
container.addView(view)
return view;}
// 在後續的應用當中,如果要開始更新View Pager當中某個View的內容時,需要進行下列動作
TextView tvRecord = myViewPager.findViewWithTag("tvRecord1");
// 假設要更新第2頁的TextView
// 進行內容更新
if (tvRecord != null ) { tvRecord.setText("update");
} /* end of if */
}
今天工作中遇到了这个纠结的问题,在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?
@Overridepublic Object instantiateItem(ViewGroup container, int position) {
View view = null;
view = mInflater.inflate(R.layout.record_list_layout, null);
TextView tvRecord = (TextView) view.findViewById(R.id.tv_record);
String key = "tvRecord" + position;
// 關鍵點,針對要更新的View來設定Tag,主要是在後續使用ViewPager.findViewWithTag()時,可以找到要更新的View
tvRecord.setTag(key);
container.addView(view)
return view;}
// 在後續的應用當中,如果要開始更新View Pager當中某個View的內容時,需要進行下列動作
TextView tvRecord = myViewPager.findViewWithTag("tvRecord1");
// 假設要更新第2頁的TextView
// 進行內容更新
if (tvRecord != null ) { tvRecord.setText("update");
} /* end of if */
}
相关文章推荐
- TCP/IP编程之close函数详解
- UIPickerView简单实用
- 自己动手编译最新Android源码及SDK
- 微信支付的封装工具类,集成微信支付
- 成为Java顶尖程序员 ,看这11本书就够了
- 300. Longest Increasing Subsequence
- codeforces 431 D. Random Task 组合数学
- nexus repair或update index 没反应 速度慢 手动配置nexus index
- java获取一维数组中连续数字分成几个连续的数字数组
- 禁止div的文字选择
- 【Android基础】趣谈Intent
- OpenGL(四)双面光照(不同材质属性)
- Struts2的异常处理
- log4j日志组件
- 各个班级学生成绩平均分
- Vim的使用手册
- 循环小数表示法
- iOS开发 ☞ const和宏的选择
- jdk 与 jre的区别
- 安装django