天天看点

Android -- 处理ViewPager的notifyDataSetChanged无刷新

Viewpager在调用notifyDataSetChanged()时,界面无刷新,它确实影响我们功能的实现了。可能选择为Viewpager重新设置一遍适配器adapter,达到刷新的目的。但是这种方法在大多数情况下,是有问题的。

super.notifyDataSetChanged()调用的是PagerAdapter.notifyDataSetChanged()

Android -- 处理ViewPager的notifyDataSetChanged无刷新
Android -- 处理ViewPager的notifyDataSetChanged无刷新

注释里说到,当附加在适配器上的数据发生变化时,应该调用该方法刷新数据。该方法调用了一个mObservable .notifyChanged();

我们继续跟进这个方法,进入DataSetObservable类中,发现这样一段代码:

Android -- 处理ViewPager的notifyDataSetChanged无刷新
Android -- 处理ViewPager的notifyDataSetChanged无刷新

这都不是重点,重点我们来看这个mObservers的类型是一个抽象类DataSetObserver,里面只有两个未实现的方法,都有谁使用了这个抽象类呢,其中我们发现了Viewpager的身影。进入viewpager,我们终于找到了viewpager中控制数据变更的重点方法dataSetChanged ,这个方法如下:

Android -- 处理ViewPager的notifyDataSetChanged无刷新
Android -- 处理ViewPager的notifyDataSetChanged无刷新

重点看这样一行代码:

意思是如果item的位置如果没有发生变化,则返回POSITION_UNCHANGED。如果返回了POSITION_NONE,表示该位置的item已经不存在了。默认的实现是假设item的位置永远不会发生变化,而返回POSITION_UNCHANGED

所以我们可以尝试着修改适配器的写法,覆盖getItemPosition()方法,当调用notifyDataSetChanged时,让getItemPosition方法人为的返回POSITION_NONE,从而达到强迫viewpager重绘所有item的目的。

Android -- 处理ViewPager的notifyDataSetChanged无刷新
Android -- 处理ViewPager的notifyDataSetChanged无刷新

继续阅读