问题描述:
在使用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真会写方法名称...