首页 > 其他分享 >Android开发 - (适配器)Adapter类中RecyclerView.Adapter实现类详细解析

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

时间:2024-08-01 18:06:20浏览次数:14  
标签:ViewHolder data Adapter 视图 public Android RecyclerView 适配器

简介

  • 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是一个抽象类它不能直接实例化,需要自定义子类

    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构建一个动态显示列表项的界面

标签:ViewHolder,data,Adapter,视图,public,Android,RecyclerView,适配器
From: https://www.cnblogs.com/ajunjava/p/18337215

相关文章

  • android IO Prefetch源码分析
    I/OPrefetcher是高通本身提供的一套优化方案,可以用在Android手机App冷启动的时候。本文基于androidQ主要分libqti-iopd、[email protected]、libqti-iopd-client_system、libqti-perfd-client_system、libperfconfig、libqti_performance,编译后在/vendor/lib/目......
  • Android TV上Recyclerview焦点控制心得
    背景:项目里有一个定时刷新的需求,刷新的数据是填充在Recyclerview里的 问题:用户可能已经滑动Recyclerview到某一位置,这时候触发了定时刷新任务,新的数据到来会触发Recyclerview的adapter.notifydatasetchanged(),这时候1.数据已经刷新,Recyclerview应该会滑动到初始位置2.Recyc......
  • 适配器模式
    适配器模式(AdapterPattern)将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作适配器继承适配对象,并实现适配目标所有的方法 国标接口(适配目标)publicinterfaceNationalStandard{voiduse()......
  • Android开发 - (适配器)Adapter类中SimpleAdapter实现类详细解析
    具体作用SimpleAdapter的主要作用是简化将数据源(如List<Map<String,Object>>)绑定到视图组件(如TextView、ImageView等)的过程。它可以根据指定的键将数据映射到指定的视图组件上,从而快速实现数据的展示参数、方法解析SimpleAdapter(Contextcontext,List<?extendsMap......
  • android.uid.system sendBroadcast失效的问题
    如果是系统应用android:sharedUserId="android.uid.system"报这个错 Callingamethodinthesystemprocesswithoutaqualifieduser:android.app.ContextImpl.sendBroadcast:1188android.content.ContextWrapper.sendBroadcast:解决添加如下权限<uses-permissionandroi......
  • Android开发 - (适配器)Adapter类中BaseAdapter实现类详细解析
    具体作用BaseAdapter是Android开发中一个非常重要的Adapter(适配器)基类。它提供了创建自定义适配器的基本实现,使开发者可以根据具体需求创建适用于不同视图(如ListView、GridView)的数据适配器。以下是BaseAdapter的主要作用:提供基本接口实现BaseAdapter实现了ListAd......
  • Android 10.0 第三方app授予DeviceOwner权限调用系统reboot,显示隐藏app,锁屏,禁用app
    1.前言 在10.0的系统rom定制化开发中,在有些客户开发app的功能中,需要系统授予app的DeviceOwner权限,然后app就可以实现重启关机禁用下拉通知栏,显示隐藏app,等功能,首选需要在app和framework中配置相关功能,接下来具体分析相关功能的实现2.第三方app授予DeviceOwner权限调用系......
  • 信步漫谈之Android——HelloWorld
    目录目标1资源2第一个HelloWorld程序3项目结构说明3.1目录结构3.2结构说明4在App中添加日志后续补充参考资料目标学习搭建Android的开发环境sayhelloworld1资源官网教程:https://developer.android.com/courses开发工具AndroidStudio下载路径:https://d......
  • 设计模式-适配器模式( Adapter Pattern)
    设计模式-适配器模式(AdapterPattern)  概要   记忆关键词:转换,兼容接口  定义:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  分析:在适配器模式中,Cilent调用Adapter以获得相应功能,Adapter扩......
  • Android开发 - (适配器)Adapter类中CursorAdapter实现类详细解析
    作用将Cursor对象中的数据与AdapterView组件(如ListView、GridView等)进行绑定。以下是CursorAdapter的主要作用:1.数据源绑定数据源连接:CursorAdapter通过Cursor对象作为数据源,实现了从数据库或其他数据源(如ContentResolver查询结果)中读取数据的功能。这使得开发者能够轻松地......