一、Recycler视图的作用
Recycler视图是用于显示大量数据的一种高性能列表视图,在Android应用中得到广泛应用。它的作用是管理列表项并在需要时刷新列表视图中的内容。
相比较于ListView,Recycler视图的优势在于:
- Recycler 视图使用 ViewHolder 机制来缓存视图对象,重用列表项视图,减少内存使用。
- Recycler 视图使用 LayoutManager 来控制列表项视图的布局,使得 RecyclerView 可以很方便地支持横向、纵向、瀑布流以及自定义布局等。
- 支持数据源发生变化时的动画效果。
接下来,我们将进一步了解 Recycler 视图的使用方法和相关注意事项。
二、使用方法
1. 布局和ViewHolder定义
在创建Recycler视图之前,我们需要先进行布局和ViewHolder的定义。与ListView相比,Recycler视图的实现更复杂,但是使用典型的Recycler视图的布局和ViewHolder的定义如下:
{@code
private class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvTitle;
private TextView tvSubtitle;
public MyViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvSubtitle = (TextView) itemView.findViewById(R.id.tvSubtitle);
}
}
}
2. 实现Adapter
实现 Adapter 对象是必须的,即必须为列表视图提供内容。ViewHolder 只是一个用来保存列表项视图的对象,而 Adapter 是用来提供视图数据的。
{@code
private class MyAdapter extends RecyclerView.Adapter {
private List mDataList;
public MyAdapter(List dataList) {
mDataList = dataList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
MyData data = mDataList.get(position);
holder.tvTitle.setText(data.getTitle());
holder.tvSubtitle.setText(data.getSubtitle());
}
@Override
public int getItemCount() {
return mDataList.size();
}
}
}
3. 设置LayoutManager和Adapter
一旦有布局、 ViewHolder 和 Adapter 就可以创建 Recycler 视图了。首先设置 LayoutManager,再设置 Adapter。
{@code
private RecyclerView mRecyclerView;
private void initRecyclerView() {
mRecyclerView = findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(new MyAdapter(getDataList()));
}
}
三、注意事项
1. RecyclerView性能问题
RecyclerView 的高性能也带来了一些问题,其中最常见的问题是滑动时的卡顿。造成这个问题的原因是在滑动过程中快速刷新视图导致的。
为了解决这个问题,我们可以采取以下措施:
- 缓存视图 ,重用列表项视图,减少内存使用。
- 使用 DiffUtil 对数据源进行比较,仅更新变化的部分视图。
2. RecyclerView中的动画效果
当数据源发生变化时,为了保证视图能够平滑地过渡,我们可以添加动画效果,使得变化更明显。
RecyclerView 支持以下两种动画类型。
- notifyItemInserted(int position):在position位置插入新的数据项时,会有一个动画效果,这个效果会从下往上弹出一个新的条目。
- notifyItemRemoved(int position):从position位置移除一个数据项时,会有一个默认的动画效果,被移除的数据项会从上往下一个条目消失。
四、完整代码示例
1. 布局recycler_view_item.xml
{@code
}
2. Recycler视图及Adapter设置方法
{@code
private void initRecyclerView() {
mRecyclerView = findViewById(R.id.recyclerView);
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
mRecyclerView.setAdapter(new MyAdapter(getDataList()));
}
//Adapter实现
private class MyAdapter extends RecyclerView.Adapter {
private List mDataList;
public MyAdapter(List dataList) {
mDataList = dataList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
MyData data = mDataList.get(position);
holder.tvTitle.setText(data.getTitle());
holder.tvSubtitle.setText(data.getSubtitle());
}
@Override
public int getItemCount() {
return mDataList.size();
}
}
// ViewHolder实现
private class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tvTitle;
private TextView tvSubtitle;
public MyViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvSubtitle = (TextView) itemView.findViewById(R.id.tvSubtitle);
}
}
//列表数据源
private List getDataList() {
List dataList = new ArrayList();
for (int i = 0; i < 50; i++) {
dataList.add(new MyData("Title " + i, "Subtitle " + i));
}
return dataList;
}
//数据项
private class MyData {
private String mTitle;
private String mSubtitle;
public MyData(String title, String subtitle) {
mTitle = title;
mSubtitle = subtitle;
}
public String getTitle() {
return mTitle;
}
public String getSubtitle() {
return mSubtitle;
}
}
}
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/198128.html
微信扫一扫
支付宝扫一扫