读书人

追溯源码解决android疑难有关问题1-Vi

发布时间: 2013-09-29 11:07:08 作者: rapoo

追溯源码解决android疑难问题1--Viewpager之notifyDataSetChanged无刷新
最近项目结束,搞了一次代码分享。其中一位同学分享了一下自己在解决问题过程中的一些心得体会,感觉受益匪浅。整理出来,分享给大家。
建议使用自己编译的android os和虚拟机,这样就可以调试android系统中的任何组件。简单说来,深入android源码,去寻找解决问题的答案。这事儿说起来简单,实际做起来还是有些难度的。我也曾经尝试着去看过,没看一会儿就晕了。

所以还是有针对性的去看源码,效率会高一些。

废话不多说,先看第一个示例。

Viewpager在调用notifyDataSetChanged()时,界面无刷新。
相信很多做过Viewpager的同学肯定遇到过这个问题,这个是bug还是android就是如此设计的,我们不做讨论。总之,它确实影响我们功能的实现了。

可能不少同学选择为Viewpager重新设置一遍适配器adapter,达到刷新的目的。但是这种方法在大多数情况下,是有问题的。

追踪源代码:
为什么调用数据更新的方法,Viewpager却没有更新呢,我们跟进该方法的源代码看一下。

首先查看适配器调用的super.notifyDataSetChanged(),该方法调到抽象基类PagerAdapter.notifyDataSetChanged()中:


进入viewpager,我们终于找到了viewpager中控制数据变更的重点方法dataSetChanged ,这个方法如下:

class SearchAdapter extends PagerAdapter {         private int mChildCount = 0;     @Override     public void notifyDataSetChanged() {                    mChildCount = getCount();           super.notifyDataSetChanged();     }     @Override     public int getItemPosition(Object object)   {                     if ( mChildCount > 0) {           mChildCount --;           return POSITION_NONE;           }           return super.getItemPosition(object);     } }

大家可以尝试一下,欢迎拍砖。


原文链接:http://www.67tgb.com/?p=624

转载注明:望月听涛

1楼lfmilaoshi昨天 21:57
有针对性的去看源码,效率会高一些。有针对性的看源码,这是我们这个行业的基本功,也是我们提高的一个捷径。
Re: wangyuetingtao昨天 22:30
回复lfmilaoshi是的,源码中很多值得学习的地方,多多领悟对自己有很大提高

读书人网 >Android

热点推荐