ViewPager的刷新以及复用

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以更新页面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值