目录
RecyclerView的基本概念
RecyclerView是一个新的viewGroup,它可以说是ListView的进阶版。它不仅仅局限于ListView垂直布局能力,还具有可扩展性。
类 | 用法 |
---|---|
适配器 | 包装数据集并为项目创建视图 |
ViewHolder | 保存所有依赖于当前项目的子视图 |
布局管理 | 在可用区域内放置物品 |
ItemDecoration | 在项目的视图周围或顶部绘制装饰 |
ItemAnimator | 添加、删除或者重新排序时动画项目 |
如果要使用RecyclerView,则必需以下内容:
- RecyclerView.Adapter——处理数据集并将其绑定到视图
- LayoutManager——设置项目的布局方式
- ItemAnimator——帮助动画项目进行常规操作,例如简单的添加或者删除项目
RecyclerView与ListView相比
- 适配器中必需的ViewHolder——ListView适配器不需要使用ViewHolder模式来提高性能,与此相反,RecyclerView需要使用它的ViewHolder模式RecyclerView.ViewHolder。
- 可自定义项目布局——ListView只能垂直排列项目,不能自定义;与此相反,RecyclerView通过RecyclerView.LayoutManager允许任何项目布局,包括水平列表或者交错网格状。
- 项目动画——ListView不包含特殊规定,相比之下,RecyclerView具有RecyclerView.ItemAnimator处理动画的类。
- 手动数据源——ListView针对不同来源选取不同的适配器,例如ArrayAdapter、CursorAdapter;与此相反,RecyclerView.Adapter通过自定义实现来向适配器提供数据。
- 手动项目装饰——举例:ListView具有android:divider在项目之间分隔的属性等;与此相反的是,RecyclerView则需要使用RecyclerView.ItemDecoration来自定义设置分隔符装饰。
- 手动手势检测——ListView具有AdapterView.OnItemClickListener绑定项目的单击事件的界面;相比,RecyclerView只有支持RecyclerView.OnItemTouchListener管理触摸事件但是没有内置的点击处理。
RecyclerView组件
LayoutManager
RecyclerView提供以下内置布局管理器:
- LinearLayoutManager:显示垂直或水平滚动列表中的项目
- GridLayoutManager:显示网格中的项目
- StaggeredGridLayoutManager:以交错网格显示项目
其中,LayoutManager默认实现为LinearLayoutManager,你可以通过此类来创建垂直或水平列表。
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.HORIENTATION);
layoutManager.scrollToPosition(position);
recyclerView.setLayoutManager(layoutManager);
RecyclerView.Adapter
它必须履行两个角色:提供对数据集的访问;负责为项目创建正确的布局。不同于ListView、AutoCompleteTextView、Spinner使用适配器,它们都继承自AdapterView。RecyclerView采用了新的基类RecyclerView.Adapter来替换旧的。
查看源码,我们会发现RecyclerView.Adapter是抽象的,因此你必须实现以下三种方法:
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
- public void onBindViewHolder(ViewHolder holder,int position)
- public int getItemCount()
ItemAnimator
ItemAnimator处理三个事件:
- 项目将添加到数据集中
- 项目将从数据集中删除
- 作为前两个操作中的一个或多个操作的结果,项目移动
如果未设置自定义ItemAnimator,则RecyclerView使用实例DefaultItemAnimator。
要使动画效果实现的话,我们必须要能够了解到数据集的更改,早期的方法已经摒弃,现在要查看动画,使用更具体的方法。