Android开发 - (适配器)Adapter类中RecyclerView.Adapter实现类详细解析

简介

  • RecyclerView 的基础适配器,用于绑定数据和创建视图持有者

具体作用

  • RecyclerView.AdapterAndroidRecyclerView 的适配器基类,负责将数据绑定到 RecyclerView 的子项视图上它是 RecyclerView 的核心组件之一用于处理数据集和视图之间的映射。具体来说,RecyclerView.Adapter 负责以下几个主要功能

    数据绑定

    • RecyclerView.Adapter 负责将数据集中的每个数据项绑定到 RecyclerView 的子项视图它创建和绑定视图确保视图和数据之间的一致性

    视图创建和更新

    • RecyclerView.Adapter 提供了 onCreateViewHolderonBindViewHolder 方法用于创建和更新视图onCreateViewHolder 方法在 RecyclerView 需要一个新的视图时被调用而 onBindViewHolder 方法用于将数据绑定到已经存在的视图上

    数据管理

    RecyclerView.Adapter 维护数据集的状态,包括数据的增加删除更新。通过调用 notifyDataSetChangednotifyItemInsertednotifyItemRemoved 等方法适配器可以通知 RecyclerView 数据发生了变化,从而刷新视图

参数、方法解析

  • RecyclerView.Adapter(List<String> data);构造方法RecyclerView.Adapter是一个抽象类它不能直接实例化,需要自定义子类

    // 适配器将使用自定义 MyAdapter 的 ViewHolder 类型
    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)
    
    • 参数解析
      • parentRecyclerView 的父视图容器。它提供了一个视图组的父容器创建视图项它是 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);
    
    • 参数解析
      • holderViewHolder 对象持有与当前视图项相关的视图组件。你可以使用这个对象来更新视图项的内容
      • 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构建一个动态显示列表项的界面

posted @ 2024-08-01 18:03  阿俊学JAVA  阅读(100)  评论(0编辑  收藏  举报