天天看点

android baseadapter 移除某个item,Android开发 ViewPager删除Item后,不会更新数据和View

问题描述:

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

public classTReleaseCircleZoomablePagerAdapter extends PagerAdapter {private List mImageUrlList = new ArrayList<>();public void removeItem(intposition){

mImageUrlList.remove(position);

notifyDataSetChanged();

}//....略

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

解决办法:

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

public classTReleaseCircleZoomablePagerAdapter extends PagerAdapter {private List mImageUrlList = new ArrayList<>();public void removeItem(intposition){

mImageUrlList.remove(position);

notifyDataSetChanged();

}

@Overridepublic int getItemPosition(@NonNull Object object) {//return super.getItemPosition(object);

returnPOSITION_NONE;

}//略......

注意关键点是返回 POSITION_NONE

为什么呢?

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

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

public intgetItemPosition(@NonNull Object object) {returnPOSITION_UNCHANGED;

}

很好上面的意思是

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

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

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

voiddataSetChanged() {//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()

}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真会写方法名称...