本文主要是介绍RecyclerView -- 中阶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
BRVAH使用
多布局
- 实体类实现
MultiItemEntity
接口,根据类型进行绑定; - 为 BaseQuickAdapter 设置代理。
标题
SnapHelper
Support RecyclerView 24.2.0中新加,让RecyclerView滑动视图后使停止位置正好停在某页的正中间。
new LinearSnapHelper().attachToRecyclerView(recyclerView);
数据刷新
dataList.clear(); //去掉之前的数据。要在原数据对象基础上。
dataList.add(weather); //添加新的Weather对象
mAdapter.notifyDataSetChanged();
重点内容
刷新全部可见的item,notifyDataSetChanged()
刷新指定item,notifyItemChanged(int)
从指定位置开始刷新指定个item,notifyItemRangeChanged(int,int)
插入、移动一个并自动刷新,notifyItemInserted(int)、notifyItemMoved(int)、notifyItemRemoved(int)
局部刷新,notifyItemChanged(int, Object)
优化
使用合适的刷新方法
数据需要全局刷新时,可以使用notifyDataSetChanged;对于增加或减少数据,可以使用如下方法实现局部刷新。
notifyItemChanged(int position)
notifyItemInserted(int position)
notifyItemRemoved(int position)
notifyItemMoved(int fromPosition, int toPosition)
notifyItemRangeChanged(int positionStart, int itemCount)
notifyItemRangeInserted(int positionStart, int itemCount)
notifyItemRangeRemoved(int positionStart, int itemCount)
嵌套时设置共享itemView对象池
class OuterAdapter extends RecyclerView.Adapter<OuterAdapter.ViewHolder> {RecyclerView.RecycledViewPool mSharedPool = new RecyclerView.RecycledViewPool();...@Overridepublic void onCreateViewHolder(ViewGroup parent, int viewType) {// inflate inner item, find innerRecyclerView by ID…LinearLayoutManager innerLLM = new LinearLayoutManager(parent.getContext(),LinearLayoutManager.HORIZONTAL);innerRv.setLayoutManager(innerLLM);innerRv.setRecycledViewPool(mSharedPool);return new OuterAdapter.ViewHolder(innerRv);}
嵌套时增加预加载
如果默认显示3个,设置LayoutManager.setInitialPrefetchItemCount(4),让默认加载4个,系统默认是2个。
减少view type的数量
创建不同的view type需要额外的inflate调用导致卡顿。尽量减少type数量。
onBindViewHolder(VH, int)不做耗时操作
在此方法中尽量只做读取数据,并设置ViewHolder。
不要做:逻辑判断;减少临时对象创建;
优化Item布局
减少布局嵌套。
使用单个监听器
全局new一个Listener,通过view.getId与view.getTag取到对应View的id和数据,避免对每个新创建的Viewholder都new出一个监听器。
值相同避免再次刷新
更新数据前,先判断是否相同?不相同再更新内容。
固定了Item的高度
避免每次绘制Item时,不再重新计算Item高度。
解析
比ListView优点
- RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑;
- 支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。
- RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);
- 通过局部刷新,就能避免调用许多无用的bindView.
标题
重点内容
- 使用RecyclerView实现Gallery画廊效果
- RecyclerView.Adapter notifyDataSetChanged 不起作用
- RecyclerView 数据刷新的几种方式
- RecyclerView刷新notifyDataSetChanged
- RecyclerView遇到notifyDataSetChanged无效时的解决方案 4*
- RecyclerView 使用ItemDecoration 巧妙实现吸附效果
- Android ListView与RecyclerView对比浅析–缓存机制
- 自定义View:实现RecyclerView的item添加悬浮层的效果
- 手把手教你实现猫眼电影选择效果 滑动,选择都让某item居中
- RecyclerView库中被我们忽略的部分
- 图文搞懂RecyclerView 的各部分组成 | RecyclerView进阶
- 一次失败的RecycleView滑动定位,SnapHelper 真香!
- 看完这篇,面试 RecyclerView 的时候再也不怕了
这篇关于RecyclerView -- 中阶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!