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以更新页面
阅读全文
0 0
- ViewPager的刷新以及复用
- ViewPager的刷新
- viewpager的刷新问题
- Viewpager的刷新机制优化
- android Viewpager中fragment的数据刷新
- ViewPager刷新单个页面的方法
- Fragement+viewPager片段刷新的一种解决方案
- ViewPager刷新单个页面的方法
- viewPager嵌套fragment的数据刷新
- ViewPager的介绍以及使用
- ViewPager内嵌ViewPager以及与SwipeRefreshLayout冲突的问题
- Fragment的生命周期,以及fragment用hide和show,以及放在Viewpager中的使用
- ViewPager滑动刷新数据
- ViewPager强制刷新UI
- ViewPager刷新问题详解
- viewpager刷新问题
- ViewPager+FragmentPagerAdapter刷新
- ViewPager刷新无效
- C++11新标准constexpr关键字
- JS获取上一访问页面URL地址——(上)
- 排序2——选择排序及优化
- 存储技术SAN、NAS、NFS、DAS、RAW、文件系统、ASM、Exadata、HDFS、LVM、RAID、LUN、Samba
- 基于item协同过滤算法实现
- ViewPager的刷新以及复用
- tomcat7.x 点击\bin\tomcat7.exe一闪而过,点击tomcat7w.exe提示未安装服务
- 《所谓情商高就是会说话》
- vue的学习记录--环境配置
- HDU 4686(矩阵快速幂)
- TI DSP C64X 优化基本方法
- JS动态实现:每个h2后添加top回到顶部
- Css精灵图合成工具---CssSprite
- 35、不一样的C++系列--智能指针