封装Recyclerview,使用起来超级方便

【Android 控件】使用 RecyclerView 显示数据列表 下面是一个典型的简单 Adapter 示例,该 Adapter 包含一个显示数据列表的嵌套 ViewHolder。ViewHolder 是包含列表中各列表项的布局的 View 的封装容器。本例只是演示 RecyclerView 的用法,故只简单显示颜色列表,数据项中只需定义一个 TextView 来显示颜色即可。在适配器的 onCreateViewHolder 方法中设置子项的点击事件,若需要设置子项中具体控件的点击事件,可以在 ViewHolder 中针对具体控件进行配置。 阅读详情

每次写recyclerview的时候需要写很多的代码,因此对其进行封装,调用的时候两三行代码搞定。

目录

1.封装一下adapter,创建第一个类CommonAdapter

2.封装Recyclerview,创建第二个类CustomRecyclerView

3.创建第三个类BaseViewHolder

4.使用方法

4.1 创建视图持有者viewholder

4.2 使用封装好的RecyclerView


1.封装一下adapter,创建第一个类CommonAdapter

该类扩展了 RecyclerView.Adapter,并使用泛型支持不同的数据类型和视图持有者。

/**
 *    desc   : 用来配合自定义的recyclerview使用
 */
public class CommonAdapter<T,VH extends BaseViewHolder<T>> extends  RecyclerView.Adapter<VH> {

    private List<T> dataList;
    private int layoutId;
    private BindData<T, VH> bindData;
    private ViewHolderFactory<VH> viewHolderFactory;  // 工厂用于创建 VH 实例

    public CommonAdapter(List<T> dataList, int layoutId, BindData<T, VH> bindData,ViewHolderFactory<VH> factory) {
        this.dataList = dataList;
        this.layoutId = layoutId;
        this.bindData = bindData;
        this.viewHolderFactory = factory;  // 传入工厂实例
    }

    // 更新数据的方法
    @SuppressLint("NotifyDataSetChanged")
    public void updateDataList(List<T> newDataList) {
        this.dataList = newDataList;
        notifyDataSetChanged();  // 通知RecyclerView数据已更新
    }
    @Override
    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        return viewHolderFactory.createViewHolder(view);  // 使用工厂方法创建 VH
    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        // 通过泛型绑定数据
        bindData.onBind(holder, dataList.get(position), position);
    }


    @Override
    public int getItemCount() {
        if (dataList==null)
        {
            return 0;
        }
        return dataList.size();
    }

    // 数据绑定回调接口
    public interface BindData<T, VH> {
        void onBind(VH holder, T data, int position);
    }
    // ViewHolder 工厂接口
    public interface ViewHolderFactory<VH> {
        VH createViewHolder(View view);
    }
}

构造函数的参数:

  • dataList:要显示的数据列表。
  • layoutId:每个项的布局资源 ID。
  • bindData:一个回调接口,用于将数据绑定到视图持有者。
  • factory:一个工厂接口,用于创建视图持有者实例。

关键方法:

  • updateDataList(List<T> newDataList):更新数据列表,并通知 RecyclerView 数据已更改。
  • onCreateViewHolder(ViewGroup parent, int viewType):创建新的视图持有者。
  • onBindViewHolder(@NonNull VH holder, int position):将数据绑定到视图持有者。
  • getItemCount():返回数据列表中的项总数。

2.封装Recyclerview,创建第二个类CustomRecyclerView

该类提供了一个方便的包装器,用于简化 RecyclerView 的设置和使用。


/**
 *    desc   : 自定义封装的Recyclerview 使用方便
 */
public class CustomRecyclerView {

    private RecyclerView recyclerView;
    private Context context;
    private RecyclerView.Adapter<?> adapter; // 将adapter变为全局变量

    public CustomRecyclerView(RecyclerView recyclerView, Context context) {
        this.recyclerView = recyclerView;
        this.context = context;
    }

    // 设置RecyclerView的Adapter
    public <T, VH extends BaseViewHolder<T>> void setAdapter(List<T> dataList, int layoutId,
                                                             CommonAdapter.BindData<T, VH> bindData, CommonAdapter.ViewHolderFactory<VH> factory) {
        adapter = new CommonAdapter<>(dataList, layoutId, bindData, factory); // 保存为全局变量
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        recyclerView.setAdapter(adapter);
    }

    // 支持GridLayoutManager
    public <T, VH extends BaseViewHolder<T>> void setGridAdapter(List<T> dataList, int layoutId, int spanCount,
                                                                 CommonAdapter.BindData<T, VH> bindData, CommonAdapter.ViewHolderFactory<VH> factory) {
        adapter = new CommonAdapter<>(dataList, layoutId, bindData, factory); // 保存为全局变量
        recyclerView.setLayoutManager(new GridLayoutManager(context, spanCount));
        recyclerView.setAdapter(adapter);
    }

    // 更新适配器数据的方法
    public <T> void updateAdapterData(List<T> newDataList) {
        if (adapter instanceof CommonAdapter) {
            ((CommonAdapter<T, ?>) adapter).updateDataList(newDataList);
        }
    }
}

构造函数的参数:

  • recyclerView:要管理的 RecyclerView 实例。
  • context:应用程序上下文。

关键方法:

  • setAdapter(...):为 RecyclerView 设置适配器,使用线性布局。
  • setGridAdapter(...):为 RecyclerView 设置适配器,使用网格布局。
  • updateAdapterData(List<T> newDataList):如果适配器是 CommonAdapter 的实例,则更新适配器中的数据。

3.创建第三个类BaseViewHolder

该类作为适配器的基础视图持有者。

public class BaseViewHolder<T> extends RecyclerView.ViewHolder {
    public T data;

    public BaseViewHolder(View itemView) {
        super(itemView);
    }
    public void bind(T data) {
        // 在这里实现数据绑定逻辑
    }
}

4.使用方法

创建完上面三个类之后,已经完成了对Recyclerview的封装

4.1 创建视图持有者viewholder

我们通过扩展 BaseViewHolder 并重写 bind() 方法实现视图持有者,处理数据绑定。

例如:
 

public class MyViewHolder extends BaseViewHolder<MyDataType> {
    TextView sceneName;
    public MyViewHolder(View itemView) {
        super(itemView);
        // 在ViewHolder中缓存控件
        sceneName = itemView.findViewById(R.id.name);
    }

    @Override
    public void bind(MyDataType data) {
        // 实现数据绑定逻辑
        if(data!=null)
        {
            sceneName.setText(data.getname)
        }
    }
}

4.2 使用封装好的RecyclerView

举个例子:

public class MyFragment extends Fragment {
    private RecyclerView recyclerView;
    private CustomRecyclerView customRecyclerView;
    private List<MyDataType> dataList; // 你的数据类型

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_my, container, false);
        recyclerView = view.findViewById(R.id.my_recycler_view);
        
        // 初始化数据列表
        dataList = new ArrayList<>();
        // 填充数据到 dataList...

        // 创建 CustomRecyclerView 实例并设置适配器
        customRecyclerView = new CustomRecyclerView(recyclerView, getContext());
        customRecyclerView.setGridAdapter(
                dataList,
                R.layout.item_rv,
                2,
                (holder, data, position) -> {
                    // 绑定数据的逻辑
                    holder.bind(data);
                },
                MyViewHolder::new
        );

        return view;
    }

    // 其他方法...
}

关键方法是这段:
 

 customRecyclerView = new CustomRecyclerView(recyclerView, getContext());
        customRecyclerView.setGridAdapter(
                dataList,
                R.layout.item_rv,
                2,
                (holder, data, position) -> {
                    // 绑定数据的逻辑
                    holder.bind(data);
                },
                MyViewHolder::new
        );

关键参数:

  • dataList:

    • 这是一个列表,包含要在 RecyclerView 中显示的数据项。数据的类型应与适配器所需的类型相匹配(例如,List<MyDataType>)。
    • dataList 中的每一项将会被传递到适配器中并显示在 RecyclerView 的每一行。
  • R.layout.item_rv:

    • 这是一个布局资源 ID,表示每个数据项在 RecyclerView 中的布局样式。对应着没封装的收viewHolder适配的那个XML 文件,定义了如何呈现每个项的视图。
    • item_rv 是你定义的布局文件名称,确保该文件存在于 res/layout 目录中。
  • 2:

    • 这个参数表示网格布局的列数。在这个例子中,每一行将会有两个列。这样设置后,RecyclerView 将会以网格的形式展示数据项。
  • (holder, data, position) -> { ... }:

    • 这是一个 Lambda 表达式,实现了 CommonAdapter.BindData 接口中的 onBind 方法。这个方法用于定义如何将数据绑定到视图持有者(ViewHolder)上。
    • 参数解释:
      • holder:这是 ViewHolder 实例,代表当前正在显示的数据项的视图持有者。
      • data:当前项的数据(例如,dataList 中的一个元素)。
      • position:当前项在列表中的位置(索引)。
    • 在这个 Lambda 表达式中,调用了 holder.bind(data);,将数据传递给 ViewHolder,执行绑定逻辑。
  • SceneViewHolder::new:

    • 这是一个方法引用,用于创建 SceneViewHolder 实例。
    • SceneViewHolder 是一个自定义的 ViewHolder 类,扩展了 BaseViewHolder,用于处理特定数据类型的视图。在这里,new 关键字表示调用 SceneViewHolder 的构造函数来创建新实例。

android RecyclerView 加载更多封装 ——可直接复制使用 前言在android开发中经常会用到RecyclerView,在重复的造轮子之后,决定对RecyclerView进行封装。在参考了鸿洋的为RecyclerView打造通用Adapter 让RecyclerView更加好用文章后,发现其中有很多自己用不到的,于是根据他的代码改了自己常用的recyclerview 加载更多功能。使用代码中有CommonAdapter以及ViewHolder两个类,可直... 阅读详情

相关推荐

Android RecyclerView的网格布局展示

在上述代码中,我们定义了一个GridAdapter类,它接收一个字符串列表作为数据源。然后,在onBindViewHolder方法中,我们根据position获取对应位置的数据,并将其绑定到ViewHolder中的TextView上。在上述代码中,我们首先找到RecyclerView控件,并为其设置一个GridLayoutManager作为布局管理器,用来控制网格布局的显示方式。完成以上步骤后,运行应用程序,你将看到一个以网格布局展示的RecyclerView,每个网格项都包含一个文本视图显示相应的数据。

DevGlider的博客 1344

RecyclerView网格布局

GridLayoutManager

LyInHeart的博客 3500

maya中的几个热盒(空格、shift、w键)

maya中许多功能打包放进了不同的热盒中,让我们使用起来更加的便捷,熟练掌握后可以大大提升了建模速度。按下不同按键后鼠标不需要精确点到某个图标,往某个方向滑滑滑就打开了相应功能,非常的炫酷和迅猛。

m0_71983242的博客 1756

Android:RecyclerView实现网格布局GridLayout

模仿企业微信工作台界面

weixin_49083184的博客 1万+

MIPS-5级流水线CPU

一、流水线CPU 流水线CPU就是指将一条分解为多步,在同一周期内进行多条指令的同时执行。MIPS五级流水线就是将指令分为:取指(IF),译码(ID),执行(EX),访存(MEM),写回(WB)五个阶段。举个例子: 比如第二条指令lui $t2,0x2100 在流水线CPU中执行的就是 可以看到在200-300ns的周期里,IF阶段取到0x00400004处的指令,300-400ns,这条指令到了ID阶段,而IF阶段执行下一条指令。400-500ns,执行这条指令,ALU的结果为0x2100

weixin_43877853的博客 2万+

S/4中的16种特殊库存类型

S/4中的16种特殊库存类型

yanzibing99的博客 1万+

使用Recyclerview实现多布局效果

使用Recyclerview实现多布局效果

qq_42500408的博客 4371

SAP采购含税价转换的底层逻辑解析:ABAP例程如何实现价税分离计算

本文深入解析SAP系统中采购含税价与不含税价的转换机制,重点介绍VOFM例程和ABAP代码实现价税分离计算的方法。通过详细讲解数学原理、税率体系及SAP定价引擎架构,为开发人员提供完整的解决方案,帮助提升采购业务中的价格处理效率和准确性。

weixin_29237635的博客 450

RecyclerView Adapter简单封装

前言       今天是新年第一天,本来打算在上一年的最后一天写下来的,但是由于玩的时间长了一点,所以今天才写,算是在新的一年开一个好头,新年新气象嘛!       至于为什么要写这个文章呐!由于项目中以前都是用ListView实现的列表,很多东西都已经习惯化了,每次都是由的新的模块或者功能才使用RecyclerView,因此一直都没有完整的总结一遍,这次也是在一个新的项目中,准备完全采用Recyc

freeCode 2599

Windows Server远程桌面断开后,PyWinAuto/按键精灵脚本失效?试试这个‘会话保持’的终极配置

本文深入解析Windows Server远程桌面断开后导致PyWinAuto/按键精灵脚本失效的问题,提供会话保持的终极配置方案。通过转换到控制台会话(console模式)和调整组策略,确保自动化程序在断开连接后持续稳定运行,适用于Windows Server各版本。

weixin_28738165的博客 227

第一章 DRM 子系统概述:1.2 专栏定位与技术覆盖范围

本专栏系统解析Linux内核DRM图形子系统的核心技术,涵盖GEM对象管理、TTM内存机制、DRM-Fence同步等核心模块,深入剖析DMA-BUF共享、DMA_Resv资源管理等关键技术。通过解读内核源码与用户态接口(libdrm),结合进程管理、匿名inode等底层机制,构建完整的DRM知识体系。专栏兼顾深度与易懂性,辅以实际应用场景分析,既适合图形驱动开发新手入门,也可满足资深工程师进阶需求,帮助读者掌握从内核实现到应用开发的全栈知识。

图形/计算GPU的驱动与虚拟化技术分享园地 3029

Android 使用Kotlin封装RecyclerView

在一个开源项目上看到了一个Android Kotlin版的RecyclerView封装,个人觉得非常方便,所以就将这个封装摘了出来,记录下,方便以后使用,这个开源的项目叫[DanDanPlayForAndroid](https://github.com/xyoye/DanDanPlayForAndroid)点击链接可以查看具体的开源项目代码。

知识应该共享,创造才应收费 1946

【AMD | Docker】超级全面版本:在Docker中验证AMD GPU移动显卡可用性的方法

1. 安装ROCm Docker支持 ■AMD GPU驱动 ■ROCM ■Docker 2. 配置Docker使用ROCm 3. 使用官方ROCm Docker镜像 4. 使用Docker CLI参数访问GPU

静谧、淡雅 684

为RecyclerView打造通用Adapter 让RecyclerView更加好用

转载请标明出处: http://blog.youkuaiyun.com/lmj623565791/article/details/47251585; 本文出自:【张鸿洋的博客】 一、概述记得好久以前针对ListView类控件写过一篇打造万能的ListView GridView 适配器,如今RecyclerView异军突起,其Adapter的用法也与ListView类似,那么我们也可以一步一步的为其打

Hongyang 16万+

18、深入解析航空飞行数据中的秘密:从数据清理到高级分析

本文详细解析了如何使用R语言处理和分析航空飞行数据,从基础的数据清理到复杂的回归分析和机器学习模型构建。文章涵盖了探索性数据分析、天气数据的整合、地理信息可视化、时间序列预测以及航班延误的优化策略等内容,展示了如何通过数据挖掘技术提高航空运营效率和乘客满意度,并探讨了数据质量评估与隐私保护的重要性。

convnet3designer的博客 107

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RecyclerView 封装Adapter之BaseRecyclerAdapter

RecyclerView 封装Adapter之BaseRecyclerAdapter 转载请标明出处: http://blog.youkuaiyun.com/lisdye2/article/details/52049857 本文出自:【Alex_MaHao的博客】 项目中的源码已经共享到github,有需要者请移步【Alex_MaHao的github】 封装BaseRecyclerAdap

茅屋 7991

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RecyclerView再封装

RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点。比如说:可以随意切换list,grid,stagger。可以指定一个或多个item刷新,而不再是全部刷新。另外可以为每个item添加动画,在体验上更进一步。

Stay 775

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android 通用RecyclerView Adapter的封装

      RecyclerView是现在安卓开发比不可少的控件,由于在项目中的大量使用,所以有必要对recyclerview的adapter做一个封装处理。如下就是近期我对RecyclerviewAdapter的封装处理。如果有需要的小伙伴可以直接拿来用。  一、封装一个BaseHolder,如下。  public class BaseHolder extends RecyclerView.Vi...

zhangyalong_android的博客 3327

超级封装RecyclerView的适配器Adapter 只需二三十行代码

前言 android开发中,RecyclerView是很常用的控件,而且功能也很强大,并且各种三方封装或者扩展库也是非常多,如:BaseQuickAdapter,XRecyclerview,当然还有我以前封装的LtRecyclerView 比如BaseQuickAdapter虽然封装的非常方便,但那是相对于java语言,那用kotlin能不能使Adapter的封装更方便呢?答案是可以 第一次...

lt的博客 1085

对RecyclerView的适配器的封装

对RecyclerView的适配器的封装 效果: 封装前代码量: package com.example.androidtestshoping.Adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.

qq_45648544的博客 2239

Android封装RecyclerView的使用

android的日常开发中经常需要使用到列表控件,最开始的时候我们使用的是ListView,随着业务的复杂性上升,页面布局不再单一,ListView的局限性越发凸显,好在google为我们提供了使用更灵活,扩展性更强大的RecyclerView,相比ListView的布局单一,RecyclerView拥有更多的布局方式,如线性布局(竖直方向或水平方向),表格布局,瀑布流布局,翻页布局(类似ViewPager)等,且支持局部刷新。 为方便我们快速使用,接下来我们对RecyclerView的使用进行简单的封装。

MuMuSir的博客 1081

RecyclerView的封装和使用(一)

概述下面是取自偶像鸿洋大神的博客中的一段话,重点是介绍RecyclerView的基本用法和其方法的含义。张鸿洋的博客RecyclerView出现已经有一段时间了,想i性能大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的空间我们并不陌生,例如:ListView、GirdView。 那么有了ListView、

做 1095

RecyclerView的简单封装记录

@TOC 1. 2. 参考材料

wodongx123的博客 498

recyclerview封装使用

文章目录记录自己使用封装的RecyclerView,最近加入了过滤器FilterCommonFilterAdapterCommonFilterAdapter使用方法:ViewHolder 复用对象SimpleDividerDecoration分割线MultiItemCommonAdapter使用方法:MultiItemCommonAdapter——使用多个xml布局MultiItemTypeSup...

zhouhangzooo的博客 290

真实项目运用-RecyclerView封装

原文链接:从零开始搭建android框架系列 项目地址:MVPCommon 前言很久没有发表从零开始搭建android框架系列这个系列的文章了 。由于最近工作确实有点忙碌,也在脚踏实地的花时间研究android方面自己很多不懂的东西。但是写博客确实是一个坚持不懈和自我提高的过程,也希望在保持文章更新的同时能够保持文章的质量 。之前翻译了一些文章,有兴趣的小伙伴可以去看一下。今天这篇文章来谈一谈

安东尼的博客 1万+

RecyclerView与ViewBinding结合简单封装

RecyclerView与ViewBinding结合简单封装 先进行BaseRecyclerViewAdapter抽象封装 //简单的封装 单布局 多布局 复用ViewHolder public abstract class BaseRecyclerViewAdapter<V> extends RecyclerView.Adapter<BaseRecyclerViewAdapter.ViewHolder> { protected ArrayList&l

陈进陆 3684
上一篇: 高德定位工具类封装
下一篇: From Coarse to Fine: Robust Hierarchical Localization at Large Scale(CVPR-2019)[从粗到精:大规模鲁棒分层定位]
我要喝可乐!
博客等级 码龄7年 132粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值