您的位置:首页 > 其它

有关Viewpager 在pageAdapter中调用notifyDataSetChanged失效的问题

2014-03-26 15:06 281 查看
遇见这个问题的时候 我开始并没有想到是viewpager的特殊导致的 可经过搜索以后发现有很多朋友遇到这个问题

大部分解决的办法是重写pageAdapter里的这个方法

这里找到个资料是从源码分析为什么notifyDataSetChanged() 不能刷新的原因
http://rincliu.com/blog/2013/09/29/viewpager/
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
但是依然有很多朋友没有解决问题 我也是 所以继续找资料

有个博主说到

这不是PagerAdapter中的Bug,通常情况下,调用notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有child view,这种情况下,所有child view位置均为POSITION_NONE,表示所有的child view都不存在,ViewPager会调用destroyItem方法销毁,并且重新生成,加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于只是希望更新child
view内容的时候,造成了完全不必要的开销。

更为靠谱的方法是因地制宜,根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行更新即可。

根据这个思路我确实解决了问题

在instantiateItem中加上setTag()

final ViewHolder viewHolder = new ViewHolder();
final View views = context.getLayoutInflater().inflate(R.layout.viewpager_item, null);
views.setTag(viewHolder);//加上这句
viewHolder.list = (ListView) views.findViewById(R.id.list);
viewHolder.add = (Button) views.findViewById(R.id.add);
以下代码略


在需要刷新的地方加上findViewWithTag()

views.findViewWithTag(viewHolder);
notifyDataSetChanged();


这样就搞定了 至少我这里的页面是可以刷新了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐