問題描述:
在使用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真會寫方法名稱...