官宣:A flexible view for providing a limited window into a large data set。
RecyclerView是在Android5.0版本作为support-v7的一个组件出现,高效替代了最初的ListView等列表组件。使用上实现了视图代码解耦,功能上具备强大的item复用机制,并且提供默认多种LayoutMananger用来处理多种布局,本篇介绍RecyclerView重要组件和基本使用。
1、RecyclerView重要组件
- LayoutManager :管理视图渲染、包含视图复用回收等功能。本身是一个抽象类,系统已经实现的子类有LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager等。
- Adapter: 适配器、数据和视图对接的桥梁。
- ItemDecoration:装饰抽象类,常常用来实现列表的分割线或者实现悬浮等功能。
- ItemAnimator:动效抽象类,常用定制item动画需求。
2、基本使用
-
库引入
目前RecyclerView所在的support被迁移到androidx中,所以引入库的时候需要在app/build.gradle中引入,具体代码如下:
implementation 'androidx.recyclerview:recyclerview:1.1.0'
- 布局 activity_mian.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
- item布局 rv_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:background="@color/colorAccent"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- 适配器 MyAdapter
public static class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> dataList;
MyAdapter(List<String> dataList) {
this.dataList = dataList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String content = dataList.get(position);
holder.tv.setText(content);
}
@Override
public int getItemCount() {
return dataList == null ? 0 : dataList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
private TextView tv;
ViewHolder(@NonNull View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
}
}
}
- 在MainActvity中添加代码
private MyAdapter adapter;
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerview);
//设置LayoutManager,以LinearLayoutManager为例子进行线性布局
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
//创建适配器
adapter = new MyAdapter(getArrayList());
//设置适配器
recyclerView.setAdapter(adapter);
}
//模拟数据
private List<String> getArrayList() {
List<String> dataList = new ArrayList<>();
for (int n = 0; n < 100; n++) {
dataList.add("item position = " + n);
}
return dataList;
}
-
最终运行效果