ViewPager的刷新以及复用

来源:互联网 发布:sql where and 编辑:程序博客网 时间:2024/06/05 19:43

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<>();@Overridepublic boolean isViewFromObject(View view, Object object) {return view == ((PagerHolder) object).itemView;}@Overridepublic int getItemPosition(Object object) {//1、如果列表为空,直接返回POSITION_NONE, 防止移除时不能刷新//2、如果下标越界,直接返回POSITION_NONE//3、根据子类isViewHolderChanged返回值 决定是否返回POSITION_NONE//如果返回POSITION_NONE 将会重新instantiateItemif (getCount() == 0 || ((PagerHolder) object).getItemPosition() >= getCount() || isViewHolderChanged((PagerHolder)object)) {return POSITION_NONE;}return POSITION_UNCHANGED;}@Overridepublic Object instantiateItem(ViewGroup container, int position) {PagerHolder holder;if (!mRecyclerList.isEmpty()) {//是否有可复用的itemholder = mRecyclerList.remove(0);} else {//新建itemholder = onCreateViewHolder(position);}holder.position = position;//绑定item数据onBindViewHolder(holder);container.addView(holder.itemView);mUsedList.add(holder);return holder;}@Overridepublic 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以更新页面

原创粉丝点击