天天看點

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真會寫方法名稱...