简介
- RecyclerView 的基础适配器,用于绑定数据和创建视图持有者
具体作用
-
RecyclerView.Adapter
是 Android 中 RecyclerView 的适配器基类,负责将数据绑定到 RecyclerView 的子项视图上。它是 RecyclerView 的核心组件之一,用于处理数据集和视图之间的映射。具体来说,RecyclerView.Adapter 负责以下几个主要功能:数据绑定
- RecyclerView.Adapter 负责将数据集中的每个数据项绑定到 RecyclerView 的子项视图。它创建和绑定视图确保视图和数据之间的一致性
视图创建和更新
RecyclerView.Adapter
提供了 onCreateViewHolder 和 onBindViewHolder 方法,用于创建和更新视图。onCreateViewHolder 方法在 RecyclerView 需要一个新的视图时被调用,而 onBindViewHolder 方法用于将数据绑定到已经存在的视图上
数据管理
RecyclerView.Adapter
维护数据集的状态,包括数据的增加、删除和更新。通过调用 notifyDataSetChanged、notifyItemInserted、notifyItemRemoved 等方法,适配器可以通知 RecyclerView 数据发生了变化,从而刷新视图
参数、方法解析
-
RecyclerView.Adapter(List<String> data);
:构造方法;RecyclerView.Adapter
是一个抽象类,它不能直接实例化,需要自定义子类public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> data; // 自定义构造方法,接收数据列表 public MyAdapter(List<String> data) { this.data = data; // 将数据列表保存到成员变量 } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { // 从数据列表中获取数据并绑定到视图 String item = data.get(position); holder.textView.setText(item); } @Override public int getItemCount() { return data.size(); // 返回数据列表的大小 } // ViewHolder 类 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView textView; public ViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } } // 初始化数据列表 List<String> data = new ArrayList<String>(); data.add("Item 1"); data.add("Item 2"); data.add("Item 3"); // 实例化 MyAdapter adapter = new MyAdapter(data)
- 参数解析:
- data:需要一个字符串类型的数据列表,这个列表会在适配器中用于填充 RecyclerView 的项
- 参数解析:
-
adapter.onCreateViewHolder(ViewGroup parent, int viewType)
:创建一个新的 ViewHolder 实例。ViewHolder 是一个用于缓存视图组件的类,它的目的是提高 RecyclerView 的性能,避免重复调用 findViewById 来获取视图组件,从而减少了视图查找的开销。这是一个抽象方法,需要重写才可以使用//在自定义RecyclerView.Adapter子类中重写 @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 使用 LayoutInflater 从布局文件中加载视图 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); // 返回新的 ViewHolder 实例 return new ViewHolder(view); } //调用:一般不需要这样调用,它会在重写onCreateViewHolder中自动调用;手动一般用于测试 //但直接手动调用 onCreateViewHolder 可能绕过 RecyclerView 的视图复用机制。RecyclerView 使用内部视图池来复用视图,从而提高性能 MyAdapter adapter = new MyAdapter(data);//假设已经创建RecyclerView.Adapter子类:MyAdapter int viewType = 0; // 视图类型,通常用于多种布局的场景 adapter.onCreateViewHolder((MyAdapter.ViewHolder) viewHolder, viewType)
- 参数解析:
- parent:RecyclerView 的父视图容器。它提供了一个视图组的父容器创建视图项。它是 RecyclerView 的布局容器,用于将新创建的视图附加到其中
- viewType:视图类型。用于区分不同类型的视图,通常用于支持多种视图类型的场景。如果你的列表项有多种布局类型,这个参数可以帮助你选择不同的布局
- 参数解析:
-
adapter.onBindViewHolder(ViewHolder holder, int position)
:将数据绑定到视图项;它是一个抽象方法,必须重写它才可以使用//在自定义RecyclerView.Adapter子类中重写 @Override public void onBindViewHolder(ViewHolder holder, int position) { // 将数据绑定到视图 String item = data.get(position); holder.textView.setText(item); } //调用:一般不需要这样调用,它会在重写onCreateViewHolder中自动调用;手动一般用于测试 //但直接手动调用 onBindViewHolder 可能绕过 RecyclerView 的视图复用机制。RecyclerView 使用内部视图池来复用视图,从而提高性能 MyAdapter adapter = new MyAdapter(data);//假设已经创建RecyclerView.Adapter子类:MyAdapter int position = 0; // 要绑定的数据的位置 adapter.onBindViewHolder((MyAdapter.ViewHolder) viewHolder, position);
- 参数解析:
- holder:ViewHolder 实例,持有与当前视图项相关的视图组件。你可以使用这个对象来更新视图项的内容
- position:要绑定的数据的位置(索引)。你可以使用这个索引从数据源中获取与当前位置相关的数据项
- 参数解析:
-
adapter.getItemCount()
:数据集的总项数。RecyclerView 使用这个值来确定需要显示多少个视图项
完整代码示例
-
我们需要两个布局文件:
activity_main.xml
,包含RecyclerView
的主布局;list_item.xml
,每个列表项的布局.-
res/layout/activity_main.xml
:包含一个RecyclerView
显示列表项<?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="match_parent" android:orientation="vertical"> <RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
-
res/layout/list_item.xml
:定义了每个列表项的布局,其中包含一个TextView
显示文本<?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="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" /> </LinearLayout>
-
-
自定义
RecyclerView.Adapter
类:MyAdapter.java
import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> data; public MyAdapter(List<String> data) { this.data = data; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //创建并返回 ViewHolder 实例 View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { String item = data.get(position); holder.textView.setText(item); } @Override public int getItemCount() { //返回数据集的大小 return data.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView textView; public ViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } }
-
启动类
import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.Arrays; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化数据列表 List<String> data = Arrays.asList("Item 1", "Item 2", "Item 3"); // 创建 MyAdapter 实例 MyAdapter adapter = new MyAdapter(data); // 获取 RecyclerView 实例 RecyclerView recyclerView = findViewById(R.id.recyclerView); // 设置 RecyclerView 的布局管理器 // RecyclerView 的布局管理器设置布局方式(这里使用 LinearLayoutManager) recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置 RecyclerView 的适配器 // 将适配器设置到 RecyclerView 上,RecyclerView 将自动管理视图的创建和数据绑定 recyclerView.setAdapter(adapter); } }
-
通过定义布局文件、实现适配器、以及将适配器设置到
RecyclerView
,构建一个动态显示列表项的界面