简单说一下我是如何解决 ViewPager 在 notifyDataChanged 之后不及时刷新的问题的

来源:互联网 发布:hadoop mac和linux 编辑:程序博客网 时间:2024/04/28 05:40

前言

最近忙于一个项目,其中需要用到 ViewPager 展示若干图片,也就是相当于有一个水平分页显示图片列表的需求。由于之前没有接触过 ViewPager,于是决定新开一个 Demo 程序,学学这个 ViewPager。
随手一个 Google 就能找到教程和文档,于是啪啦啪啦键盘,一个基本的实现就出来了。

问题描述

我在 Demo 里边实现了两个基本操作,add 和 remove,测试的时候就问题就来了,简单地说就是 ViewPager 的刷新问题,如图,一搜一大把。
这里写图片描述
我浏览了其中一些,但是感觉最有用的就是这一篇,来自 diygreen 的一篇博文:

ViewPager刷新问题详解- 简书

在里面作者提出了解决方案,

那就是直接一刀切:重写 PagerAdapter 的 getItemPosition(Object object) 方法,将返回值固定为 POSITION_NONE。这种方式有一个需要注意的地方,就是重写 destoryItem() 方法:

@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {    // 把 Object 强转为 View,然后将 view 从 ViewGroup 中清除    container.removeView((View) object);}

同时作者也说明了该方案的缺点,

有个很明显的缺陷,那就是会刷新所有的 Item,这将导致系统资源的浪费,所以这种方式不适合数据量较大的场景。

缺点显而易见,虽然作者在后面也提出了优化方案(具体请查看作者原文),但我弱弱的觉得方案仍然不够好,因为我想到一个自己觉得还不错的点子,所以才发表本篇博文希望能与大家分享和讨论。(说了半天废话,终于有了重点,23333~)

我的解决方案

下面给出我的解决方案,请看代码:

@Overridepublic 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 截图,如下
这里写图片描述
希望大加如果采用了我的方案,能够给我一条评论,提出问题也好,表示鼓励也好,谢谢~

0 0
原创粉丝点击