问题描述: 

  在使用ViewPager的适配器删除适配器里一个Item后依然会,而删除的这个item依然会保留缓存,适配器不会重新加载更新数据.如下代码:

public class TReleaseCircleZoomablePagerAdapter extends PagerAdapter {
private List<TReleaseCircleBase.Pic> mImageUrlList = new ArrayList<>(); public void removeItem(int position){
mImageUrlList.remove(position);
notifyDataSetChanged(); } //....略

在这个代码里removeItem(int position)是希望清理适配器List里的一项item,并且重新刷新.但是其实真实情况是并不会重新刷新...... 在滑动超过3个页面后才会让你那个删除item消失.

解决办法:

依然在这个适配器里重写public int getItemPosition(@NonNull Object object)方法

public class TReleaseCircleZoomablePagerAdapter extends PagerAdapter {
private List<TReleaseCircleBase.Pic> mImageUrlList = new ArrayList<>(); public void removeItem(int position){
mImageUrlList.remove(position);
notifyDataSetChanged(); } @Override
public int getItemPosition(@NonNull Object object) {
// return super.getItemPosition(object);
return POSITION_NONE;
} //略......

注意关键点是返回 POSITION_NONE

为什么呢?

  为什么我改了这个之后就可以在删除item后更新view了呢?好奇心害死猫,我们进一步探究一下.

  首先我们看看 return super.getItemPosition(object); 父类里写的返回值到底里面有啥

  

    /**
* 在主视图尝试确定项目的位置时调用
* 已经改变。 如果给定的位置,则返回{@link #POSITION_UNCHANGED}
* 如果适配器中不再存在该项,则item未更改或{@link #POSITION_NONE}。
*
* <p>The default implementation assumes that items will never
* change position and always returns {@link #POSITION_UNCHANGED}.
*
* @param object Object representing an item, previously returned by a call to
* {@link #instantiateItem(View, int)}.
* @return object's new position index from [0, {@link #getCount()}),
* {@link #POSITION_UNCHANGED} if the object's position has not changed,
* or {@link #POSITION_NONE} if the item is no longer present.
*/
public int getItemPosition(@NonNull Object object) {
return POSITION_UNCHANGED;
}

很好上面的意思是

如果视图item已经是加载过的,就使用 POSITION_UNCHANGED 来标识,表示这个item不需要重复更新

如果item在适配器里不存在,就说item未加载过,就使用 POSITION_NONE 来标识,标识这个item需要更新一次

接着继续探究下ViewPager是怎么调用getItemPosition()的

void dataSetChanged() {
// This method only gets called if our observer is attached, so mAdapter is non-null. final int adapterCount = mAdapter.getCount();
mExpectedAdapterCount = adapterCount;
boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1
&& mItems.size() < adapterCount;
int newCurrItem = mCurItem; boolean isUpdating = false;
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
final int newPos = mAdapter.getItemPosition(ii.object); if (newPos == PagerAdapter.POSITION_UNCHANGED) {
continue;
} if (newPos == PagerAdapter.POSITION_NONE) {
mItems.remove(i);
i--; if (!isUpdating) {
mAdapter.startUpdate(this);
isUpdating = true;
} mAdapter.destroyItem(this, ii.position, ii.object);
needPopulate = true; if (mCurItem == ii.position) {
// Keep the current item in the valid range
newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
needPopulate = true;
}
continue;
}
上面的if (newPos == PagerAdapter.POSITION_UNCHANGED) 和 if (newPos == PagerAdapter.POSITION_NONE) 就已经破案了...,只能说google真会写方法名称...

Android开发 ViewPager删除Item后,不会更新数据和View的更多相关文章

  1. Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  2. Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(2)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  3. Android开发之漫漫长途 Ⅲ——Activity的显示之Window和View(2)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  4. eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass method 在做arcgis android开发的时候,突然遇到这种错误,The method onClick(View) of type new View.OnClickListener(){} mus

    eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass met ...

  5. Android开发——Viewpager的介绍使用

    目录: 一.Viewpager的简单介绍 二.简单的Viewpager使用 三.简单显示图片的Viewpager实现 四.广告图的实现及Viewpager指示器(小圆点)的实现 五.APP引导页的实现 ...

  6. RK3399 Android 7.1 删除repo后编译报错

    CPU:RK3399 系统:Android 7.1 瑞芯微使用的是 repo 来进行代码管理,但我们需要用 git 来管理,所以就删除了 repo,但是编译就报错,如下:Server is alrea ...

  7. Android开发UI之开源项目第一篇——个性化控件(View)篇

    原文:http://blog.csdn.net/java886o/article/details/24355907 本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍A ...

  8. Android 开发环境搭建以及工具(不断更新)

    学习android需要学习的编程知识 https://wiki.cyanogenmod.org/w/Doc:_Development_Resources 从http://source.android. ...

  9. Android开发,使用背景图(xml drawable)为view 设置边框

    Android 开发中,遇到需要设置边框的情景,使用背景图来实现,代码如下: <layer-list xmlns:android="http://schemas.android.com ...

随机推荐

  1. python入门 类的继承和聚合(五)

    继承 class Rocket: def __init__(self, name, distance): self.name = name self.distance = distance def l ...

  2. .Net Core 部署之一 《CentOS 从GitHub/Gitee 等源代码网站部署Web网站》

    先看下楼主从某阿打折购买的渣渣服务器 lsb_release -a 一.安装dotnet-SDK 注册微软的服务 sudo rpm -Uvh https://packages.microsoft.co ...

  3. nginx分布式实例入门操作

    本文目的 前段时间学习WCF已经渐入佳境,完成了既定学习目标,转入分布式系统学习.本文技术路线是: 采用wcf实现分布式服务端和客户端,客户端部署于本地主机,nginx和WCF部署于虚拟机端(分别是三 ...

  4. class12_pack_grid_place 放置位置

    其中的部分运行效果图(程序见序号1): #!/usr/bin/env python# -*- coding:utf-8 -*-# ----------------------------------- ...

  5. elasticsearch的基本用法(转载)

    本文出自:http://blog.csdn.net/feelig/article/details/8499614 最大的特点:  1. 数据库的 database, 就是  index  2. 数据库 ...

  6. 【POJ】3259 Wormholes

    题目链接:http://poj.org/problem?id=3259 题意:n个农场,m条双向路径,w条单向路径(虫洞).单向虫洞路径是负值.农夫想知道自己能不能看到自己(X). 题解:其实刚开始没 ...

  7. java oop遍历List和Map的几种方法

    一.list的遍历 import java.util.*; public class ListTest { public static void main(String[] args) { List& ...

  8. 为什么学习JavaScript

    为什么学习JavaScript 一.你知道,为什么JavaScript非常值得我们学习吗? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. ...

  9. Mysql优化-字段设计

    摘抄并用于自查笔记 1. 对精度有要求decimal float 类型用于表示单精度浮点数值,而double类型用于表示双精度浮点数值,float 和 double 都是浮点型,而 decimal 是 ...

  10. html编写的日历

    1.html (1) <html> <head> <meta http-equiv="Content-Type" content="text ...