RecyclerView 与 ListView 的主要区别:
- 使用
- 布局效果
- 局部刷新
- 嵌套滚动机制
- 布局效果对比
- 常用功能和API对比
- RecyclerView 和 ListView 在 Android L 引入嵌套滚动机制之后的对比
(1)简单使用
ListView:
- 继承重写BaseAdapter类
- 自定义 ViewHolder 和 convertView 一起完成复用优化工作(在自定义的ADP、adapter中完成)
RecyclerView:
- 继承重写RecyclerView.Adapter与RecyclerView.ViewHolder
- 在ViewHolder中传入View参数,获取布局实例findViewById()
- onCreateViewHolder()--------加载布局,创建ViewHolder实例
- onBindViewHolder()--------子项数据赋值
- getItemCount()-------子项数
- 设置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()