RecyclerView 与 ListView 的主要区别

RecyclerView 与 ListView 的主要区别:

  1. 使用
  2. 布局效果
  3. 局部刷新
  4. 嵌套滚动机制
  1. 布局效果对比
  2. 常用功能和API对比
  3. RecyclerView 和 ListView 在 Android L 引入嵌套滚动机制之后的对比
(1)简单使用

ListView

  1. 继承重写BaseAdapter类
  2. 自定义 ViewHolder 和 convertView 一起完成复用优化工作(在自定义的ADP、adapter中完成)

RecyclerView:

  1. 继承重写RecyclerView.Adapter与RecyclerView.ViewHolder
    • 在ViewHolder中传入View参数,获取布局实例findViewById()
    • onCreateViewHolder()--------加载布局,创建ViewHolder实例
    • onBindViewHolder()--------子项数据赋值
    • getItemCount()-------子项数
  2. 设置LayoutManager,以及layout的布局效果
    • LayoutManager-------LinearLayoutManager,GridLayoutManager,staggeredGridLayoutManager
(2)布局效果

ListView:布局单一,只有纵向效果

RecyclerView:布局效果丰富(3种);LayoutManager的API中自定义Layout:

(3)实现嵌套滚动机制
  • 在事件分发机制中,Touch事件在进行分发的时候,由父View向子View传递,一旦子View消费这个事件的话,那么接下来的事件分发的时候,父View将不接受,由子View进行处理;但是与Android的事件分发机制不同,嵌套滚动机制(Nested Scrolling)可以弥补这个不足,能让子View与父View同时处理这个Touch事件,主要实现在于NestedScrollingChild与NestedScrollingParent这两个接口;而在RecyclerView中,实现的是NestedScrollingChild,所以能实现嵌套滚动机制;

  • ListView就没有实现嵌套滚动机制;

(4)局部刷新

RecyclerView:notifyItemChanged(),局部刷新

ListView:

  • notifyDataSetChanged() ,全局刷新(每个item的数据都会重新加载一遍),非常消耗资源;

  • 如何实现局部刷新?

    • 在adapter里定义一个方法notifyDataSetChangedAt(View view,int position),然后在该方法处理逻辑(自定义局部刷新方法)

      public void notifyDataSetChangedAt(View view,int position) {
            if(view != null){
                int data = datas.get(position);
                data = data+1;
                datas.set(position,data);
                TextView textView = (TextView) view.findViewById(R.id.textview);
                textView.setText(String.valueOf(data));
            }
       }
      ————————————————
      //在外部调用,实现调用
      mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               /*int data = datas.get(position);
               data = data+1;
               datas.set(position,data);
               adapter.notifyDataSetChanged();*/----->刷新全部数据
               adapter.notifyDataSetChangedAt(view,position);----》刷新局部数据
           }
      });
      
      

【扩展】:View的重新绘制过程

onMeasure()–>onLayout()–>onDraw()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值