前言
最近忙于一个项目,其中需要用到 ViewPager 展示若干图片,也就是相当于有一个水平分页显示图片列表的需求。由于之前没有接触过 ViewPager,于是决定新开一个 Demo 程序,学学这个 ViewPager。
随手一个 Google 就能找到教程和文档,于是啪啦啪啦键盘,一个基本的实现就出来了。
问题描述
我在 Demo 里边实现了两个基本操作,add 和 remove,测试的时候就问题就来了,简单地说就是 ViewPager 的刷新问题,如图,一搜一大把。
我浏览了其中一些,但是感觉最有用的就是这一篇,来自 diygreen 的一篇博文:
在里面作者提出了解决方案,
那就是直接一刀切:重写 PagerAdapter 的 getItemPosition(Object object) 方法,将返回值固定为 POSITION_NONE。这种方式有一个需要注意的地方,就是重写 destoryItem() 方法:
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 把 Object 强转为 View,然后将 view 从 ViewGroup 中清除
container.removeView((View) object);
}
同时作者也说明了该方案的缺点,
有个很明显的缺陷,那就是会刷新所有的 Item,这将导致系统资源的浪费,所以这种方式不适合数据量较大的场景。
缺点显而易见,虽然作者在后面也提出了优化方案(具体请查看作者原文),但我弱弱的觉得方案仍然不够好,因为我想到一个自己觉得还不错的点子,所以才发表本篇博文希望能与大家分享和讨论。(说了半天废话,终于有了重点,23333~)
我的解决方案
下面给出我的解决方案,请看代码:
@Override
public int getItemPosition(Object object) {
if (viewList.contains((View) object)) {
// 如果当前 item 未被 remove,则返回 item 的真实 position
Log.e("view is contains", true + "");
return viewList.indexOf((View) object);
} else {
// 否则返回状态值 POSITION_NONE
Log.e("view is contains", false + "");
return POSITION_NONE;
}
}
经过我的测试,暂时未发现这样写又引入新的 bug,觉得效果还可以,简单的录制了一个 GIF 截图,如下
希望大加如果采用了我的方案,能够给我一条评论,提出问题也好,表示鼓励也好,谢谢~