RecyclerView -- 中阶

BRVAH使用

多布局

  1. 实体类实现MultiItemEntity 接口,根据类型进行绑定;
  2. 为 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();

    ...

    @Override
    public 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优点

  1. RecyclerView比ListView多两级缓存,支持多个离ItemView缓存,支持开发者自定义缓存处理逻辑;
  2. 支持所有RecyclerView共用同一个RecyclerViewPool(缓存池)。
  3. RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);
  4. 通过局部刷新,就能避免调用许多无用的bindView.

标题

重点内容

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值