1、刷新ViewPager时缓存页面默认是不会刷新的, 只有将PagerAdapter的getItemPosition方法返回值改为POSITION_NONE时才会刷新, 但是如果都改为POSITION_NONE的话,那开销有点大
2、一个Item在destory后不能复用
为解决以上两个问题,封装了一个BasePagerAdapter,见代码:
public abstract class BasePagerAdapter extends PagerAdapter {
/**
* 已经销毁的Item,存起来复用
*/
private final List<PagerHolder> mRecyclerList = new LinkedList<>();
/**
* 正在使用的Item, 存起来以便可以定点刷新
*/
private final List<PagerHolder> mUsedList = new LinkedList<>();
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((PagerHolder) object).itemView;
}
@Override
public int getItemPosition(Object object) {
//1、如果列表为空,直接返回POSITION_NONE, 防止移除时不能刷新
//2、如果下标越界,直接返回POSITION_NONE
//3、根据子类isViewHolderChanged返回值 决定是否返回POSITION_NONE
//如果返回POSITION_NONE 将会重新instantiateItem
if (getCount() == 0 || ((PagerHolder) object).getItemPosition() >= getCount() || isViewHolderChanged((PagerHolder)
object)) {
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
PagerHolder holder;
if (!mRecyclerList.isEmpty()) {//是否有可复用的item
holder = mRecyclerList.remove(0);
} else {//新建item
holder = onCreateViewHolder(position);
}
holder.position = position;
//绑定item数据
onBindViewHolder(holder);
container.addView(holder.itemView);
mUsedList.add(holder);
return holder;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
PagerHolder holder = (PagerHolder) object;
container.removeView(holder.itemView);
mUsedList.remove(holder);
mRecyclerList.add(holder);
}
public List<PagerHolder> getUsedHolders() {
return mUsedList;
}
public abstract PagerHolder onCreateViewHolder(int position);
public abstract void onBindViewHolder(PagerHolder holder);
public abstract boolean isViewHolderChanged(PagerHolder holder);
/**
* 参照RecyclerView的机制定义了一个缓存类
*/
public static class PagerHolder {
public View itemView;
private int position;
public PagerHolder(View view) {
this.itemView = view;
}
public int getItemPosition() {
return position;
}
}
}
最重要的是重写isViewHolderChanged方法, 重写时可以根据PagerHolder内的值跟当前list.get(positon)值进行比对, 如果不相同就返回true以更新页面