在使用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消失.ide
依然在这个适配器里重写public int getItemPosition(@NonNull Object object)方法this
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_NONEgoogle
为何我改了这个以后就能够在删除item后更新view了呢?好奇心害死猫,咱们进一步探究一下.spa
首先咱们看看 return super.getItemPosition(object); 父类里写的返回值到底里面有啥
code
/** * 在主视图尝试肯定项目的位置时调用 * 已经改变。 若是给定的位置,则返回{@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; }
很好上面的意思是server
若是视图item已是加载过的,就使用 POSITION_UNCHANGED 来标识,表示这个item不须要重复更新blog
若是item在适配器里不存在,就说item未加载过,就使用 POSITION_NONE 来标识,标识这个item须要更新一次rem
接着继续探究下ViewPager是怎么调用getItemPosition()的get
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真会写方法名称...