[Android]RecyclerViewAdapter的封装

RecyclerView多级联动 列表多级联动 阅读详情

现在项目中基本都使用RecyclerView了,因此对RecyclerView对Adapter的封装就显得很有必要。
具体的实现逻辑:

  1. 将数据集合中对Bean规定为泛型
  2. 通过抽象方法在子类中传入布局动态初初始化ViewHolder
  3. 通过抽象方法将Bean和ViewHolder绑定

具体代码如下:

public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerAdapter.BaseViewHolder> {

    protected List<T> mDatas;//数据集合
    protected Context mContext;//上下文
    protected OnItemClickListner onItemClickListner;//单击事件

    public BaseRecyclerAdapter(List<T> mDatas) {
        this.mDatas = mDatas;
        setHasStableIds(true);
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();
        View view = LayoutInflater.from(mContext).inflate(getLayoutId(), parent, false);
        final BaseViewHolder baseViewHolder = new BaseViewHolder(view);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onItemClickListner != null)
                onItemClickListner.onItemClickListner(v, baseViewHolder.getLayoutPosition());
            }
        });
        return baseViewHolder;
    }

    @Override
    public void onBindViewHolder(BaseRecyclerAdapter.BaseViewHolder holder, final int position) {
        T t = mDatas.get(position);
        bindData(holder, position, t);
    }

    @Override
    public int getItemCount() {
        return mDatas == null ? 0 : mDatas.size();
    }

    /**
     * 刷新数据
     *
     * @param datas
     */
    public void refresh(List<T> datas) {
        this.mDatas.clear();
        this.mDatas.addAll(datas);
        notifyDataSetChanged();
    }

    /**
     * 添加数据
     *
     * @param datas
     */
    public void addData(List<T> datas) {
        this.mDatas.addAll(datas);
        notifyDataSetChanged();
    }
    
    /**
     * 添加数据(局部刷新,局部刷新时必须充血getItemId方法,同时setHasStableIds(true))
     *
     * @param datas
     */
    public void addDataWithoutAnim(List<T> datas) {
        if (datas == null)
            return;
        int size = mDatas.size();
        this.mDatas.addAll(datas);
        notifyItemRangeChanged(size, datas.size());
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    /**
     * 初始化item布局,获取item
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 绑定数据
     *
     * @param holder   具体的viewHolder
     * @param position 对应的索引
     * @param t
     */
    protected abstract void bindData(BaseViewHolder holder, int position, T t);

    /**
     * 设置文本属性
     *
     * @param view
     * @param text
     */
    public void setItemText(View view, String text) {
        if (view instanceof TextView) {
            ((TextView) view).setText(text);
        }
    }

    /**
     * 设置图片属性
     *
     * @param view
     * @param url
     */
    public void setItemImage(View view, String url) {
        if (view instanceof ImageView && mContext != null) {
            ImageView imageView = (ImageView) view;
            new GlideImageLoader().displayImage(mContext, url, imageView);
        }
    }

    /**
     * 设置圆形图片属性
     *
     * @param view
     * @param url
     */
    public void setItemImageCircle(View view, String url) {
        if (view instanceof ImageView && mContext != null) {
            ImageView imageView = (ImageView) view;
            new GlideImageLoader().displayImageForCircle(mContext, url, imageView);
        }
    }

    /**
     * 设置圆形图片属性
     *
     * @param view
     * @param drawable
     */
    public void setItemImageDrawable(View view, Drawable drawable) {
        if (view instanceof ImageView) {
            ImageView imageView = (ImageView) view;
            imageView.setImageDrawable(drawable);
        }
    }

    /**
     * 设置控件可见性
     *
     * @param view
     * @param visible
     */
    public void setItemViewVisible(View view, int visible) {
        if (view != null) {
            switch (visible) {
                case View.VISIBLE:
                    view.setVisibility(View.VISIBLE);
                    break;
                case View.INVISIBLE:
                    view.setVisibility(View.INVISIBLE);
                    break;
                case View.GONE:
                    view.setVisibility(View.GONE);
                    break;
                default:
                    break;
            }
        }
    }

    public void setOnItemClickListner(OnItemClickListner onItemClickListner) {
        this.onItemClickListner = onItemClickListner;
    }

    public interface OnItemClickListner {
        void onItemClickListner(View v, int position);
    }

    /**
     * 封装ViewHolder ,子类可以直接使用
     */
    public class BaseViewHolder extends RecyclerView.ViewHolder {

        private SparseArray<View> mViewSparseArray;

        public BaseViewHolder(View itemView) {
            super(itemView);
            mViewSparseArray = new SparseArray<>();
        }

        /**
         * 获取设置的view
         *
         * @param id
         * @return
         */
        public View getView(int id) {
            View view = mViewSparseArray.get(id);
            if (view == null) {
                view = itemView.findViewById(id);
                mViewSparseArray.put(id, view);
            }
            return view;
        }
    }
}
Android RecyclerView通用适配器,支持Header、Footer、LoadMore、EmptyView等功能 前言RecyclerView已经发布很久了,高度的解耦性和灵活的定制性使得其一经发布就广受好评,但在使用过程中会发现,编写适配器的代码量貌似有点多,而且不支持添加HeaderView、FooterView等功能,甚至连Item点击监听都没有,这当然是不能忍的,所以还是有必要对其封装一下,当然现在已经有很多这样的开源框架,但自己实现一下也挺好,就当认真总结了。RecyclerViewAdapter源码 阅读详情

相关推荐

手把手教你用Wireshark抓包分析Profinet非周期通信(附实战案例)

本文详细解析了PROFINET非周期通信(RTA)的技术原理与实战应用,通过Wireshark抓包分析,揭示从PLC请求到驱动器响应的完整对话过程。涵盖实验环境搭建、关键配置步骤、典型参数访问流程及故障诊断案例,帮助工程师深入理解并优化工业网络通信性能。

Black的专栏 1049

Recyclerview.getLayoutPosition()问题

使用Recyclerview 时,如果要添加item的点击监听等功能,可以在Recyclerview.Adapter的onBindViewHolder中设置 例如: @Override public void onBindViewHolder(final MyViewHolder holder, int position) { holder.tv.setHeight(150*(1+

ListeneR的博客 1万+

修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案

1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage...

qq_33835957的博客 7万+

BaseRecyclerViewAdapterHelper源码解读(一) 封装简单的adapter和万能的BaseViewHolder

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取/**通过drawable文件夹中的资源设置图片@param viewId view的id@param resId 文本*//**通过Bitmap设置图片*/if (bitmap!= null) {

2401_84692362的博客 868

10行代码搞定QMT实盘交易:手把手教你用Python自动化买卖股票(附完整源代码)

本文提供了一份详尽的QMT实盘交易教程,手把手教你使用Python构建自动化交易系统。内容涵盖环境配置、账户连接、查询与下单等核心代码,并附有完整的源代码示例,帮助开发者快速掌握从零到实盘的完整流程,实现安全可靠的股票自动化买卖。

weixin_29214335的博客 439

MIKE11实战:平原河网水动力建模从入门到精通(附GIS数据处理技巧)

本文系统介绍了MIKE11软件在平原河网水动力建模中的完整实战流程。从GIS数据预处理、河网构建、参数率定到结果分析,详细阐述了构建可靠数字孪生模型的关键步骤与技巧,旨在帮助水利工程师高效解决平原地区复杂水流模拟的挑战,为防洪决策提供科学依据。

weixin_28419039的博客 689

CommonQuickAdapter 获取数据长度 和当前位置

getData().size() ​​​​​​​ (baseViewHolder.getLayoutPosition()

qq_34912760的博客 547

从噪声中提取真相:LabVIEW振动信号积分处理的降噪艺术

本文深入探讨了LabVIEW在振动信号积分处理中的降噪技术,揭示了如何通过选择性频率加权从噪声中提取关键故障特征。详细介绍了时域和频域积分方法的实现原理及优化策略,并结合工业案例展示了多轴信号联合降噪的实际应用效果,为设备状态监测提供了高效解决方案。

weixin_29164185的博客 302

Android 一起来封装一个RecyclerViewAdapter

前言 上一篇我们一起封装了一个还算简单实用的 Adapter,可惜是 ListView、GridView 用的。在 RecyclerView 大行其道的如今,对应 Adapter 的使用简单也是一个必然的需求。 正文 按照惯例,先来看看一个原始的 RecyclerViewAdapter 是怎么写的 RecyclerView.Adapter adapter = new RecyclerView.Ad...

weixin_34259159的博客 124

从零开始理解二极管限幅:5种典型电路设计及实际应用场景解析

本文系统解析了二极管限幅电路的五大经典拓扑,包括串联与并联型上下限幅及双向限幅。通过剖析其核心原理与二极管的单向导电性、正向压降特性,结合ADC输入保护、电源管理、音频处理等实际应用场景,提供了从器件选型到设计陷阱规避的完整实战指南,帮助工程师为信号构建可靠的“安全笼”。

2y3u4i5o6p的博客 1034

XILINX RFSoC全面解析(五)—— Zynq UItrascale+ RF Data Converter IP核详解

这期我们来看看RFSoC独有的IP核——Zynq UItrascale+ RF Data Converter如何使用。 我使用的VIVADO版本是2018.3,这个是最低版本,要开发RFSoC,VIVADO版本必须不低于2018.3。 另外电脑配置也需要很高,64位,8核@3.4GHz CPU,16GB内存,固态硬盘基本就是低配,跑起来很勉强。建议有条件的朋友使用工作站或者服务器。 首先在VIVADO中新建一个工程,因为我使用的是xilinx官方的开发板,所以可以直接设定选board就行。 在I

1万+

Android 一起来封装一个 RecyclerViewAdapter

前言上一篇我们一起封装了一个还算简单实用的 Adapter,可惜是 ListView、GridView 用的。在 RecyclerView 大行其道的如今,对应 Adapter 的使用简单也是一个必然的需求。正文按照惯例,先来看看一个原始的 RecyclerViewAdapter 是怎么写的RecyclerView.Adapter adapter = new RecyclerView.Adapter

neverwoods的博客 850

智能挂锁软件需求规格说明书(SRS)

智能挂锁系统SmartPadlockV1.0是一款融合蓝牙通信、指纹识别和远程控制技术的便携式安防设备。系统由设备端、移动App和云平台三部分组成,支持蓝牙配对(10米内)、指纹识别、OTP一次性密码等多种开锁方式,响应时间<1.5秒。产品采用SM2/SM4加密技术保障安全,日均20次使用下续航达180天,兼容iOS13+/Android8.0+系统。功能包括设备绑定、远程授权、开锁记录查询和OTA固件升级,符合个人信息保护法规要求,适用于仓储、快递柜等多场景应用。

moton2017的博客 2112

Android 轻松定制属于自己的RecyclerViewAdapter

前言 自从RecyclerVIew出来后就尝试着用它,效果真的是比ListView好多了。 但是发现了一个问题,由于RecyclerView的Adapter必须继承自RecyclerView.Adapter,并且指定我们写的ViewHolder为泛型,为了达到万能的效果,我们把需要传入的Java Bean属性直接用一个泛型T指代,我们都在不停的重复写这几个方法①,为何不像之前ListView一

Jokey 2236

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RecyclerViewAdapter 项目推荐

RecyclerViewAdapter 项目推荐 1. 项目基础介绍和主要编程语言 RecyclerViewAdapter 是一个基于 Kotlin 语言编写的开源项目,旨在为 Android 开发者提供一个高效、灵活且易于使用的 RecyclerView Adapter 封装库。该项目充分利用了 Kotlin 的高级特性,如 DSL(领域特定语言)和扩展函数,以优化代码书写方式,实现高内聚低耦合...

gitblog_00426的博客 516

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RecyclerViewAdapter:高效便捷的RecyclerView适配器框架

RecyclerViewAdapter:高效便捷的RecyclerView适配器框架 项目介绍 RecyclerViewAdapter 是一个专为 Android 开发者设计的 RecyclerView 适配器框架。它旨在简化 RecyclerView 的使用,提供了一系列强大的功能,帮助开发者快速实现复杂的列表展示需求。无论是简单的单类型列表,还是复杂的多种 ViewType 混合列表,Recy...

gitblog_00425的博客 1167

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android下拉加载框架_一个全新的RecyclerView Adapter框架源码开源

RecyclerViewAdapter 重新定义RecyclerView Adapter的封装,追求既简单又实用,结合Kotlin的高级特性,优化代码书写方式,真正做到高内聚低耦合开源地址 https://github.com/ibaozi-cn/RecyclerViewAdapter框架设计核心思想 摒弃notifyDataSetChanged无脑操作,利用ObservableList...

weixin_35975197的博客 204

安卓技术收录

工作之中见到一些比较好的文章,为了方便以后查阅,将地址收录如下: 1.我的吱吱: 地址:http://www.jianshu.com/p/e2a8c34932a6 2.安卓转场动画详解。 http://www.jianshu.com/p/1b5212d84a15 3.安卓夜间模式切换。 http://yuqirong.me/2016/09/08/%E5%AF%B9%E4%BA%8EAn

zhangyalong_android的博客 437

Android常用工具类与常用公共自定义控件

前言 今天跟大家整理一下一些比较常用的公共类,基本上在开发中都能用到 内容 常用公共类 1、点击时间判断类(ClickUtlils) 防止多次点击,以免重复进入界面 2、时间日期内 (DateUtils) 获取时间 年月日 时 分 秒,时间搓、秒换分 分换秒 3、日志类(LogUtils) ...

Bisheng_Xiong的博客 732

Databinding之RecyclerViewAdapter使用与封装

Databinding之RecyclerViewAdapter使用与封装 RecyclerViewAdapter大家都不陌生,那么在使用Databinding时,RecyclerViewAdapter该如何编写呢? 本文用一个邮箱类型列表作为案例,来讲解在使用Databinding时如何编写RecyclerViewAdapter,并且如何有效的封装RecyclerViewAdapter。 ...

gogo_wei的博客 4125

treewidget怎么设置某一个item拖动的_一个全新的RecyclerView Adapter框架源码开源

RecyclerViewAdapter 重新定义RecyclerView Adapter的封装,追求既简单又实用,结合Kotlin的高级特性,优化代码书写方式,真正做到高内聚低耦合开源地址 https://github.com/ibaozi-cn/RecyclerViewAdapter框架设计核心思想 摒弃notifyDataSetChanged无脑操作,利用ObservableList...

weixin_39635130的博客 148

RecycleView多布局

RecycleViewAdapter多布局 现在在实际开发中,越来越多的人选择RecyclerView来实现列表布局,而RecyclerView写多了,每次都要直接继承Adapter实现onCreateViewHolder、onBindViewHolder、getItemCount这三个方法,虽然代码量不算很大,但每个XXXAdapter其实都长得差不多,这种重复性的代码,开发者是最不想写的了,所以网上就出现了很多封装Adapter的开源库。 所以本篇文章也介绍自己封装的一个Adapter,帮你快速高效的添

阿呆博客 748

android封装设置item,GitHub - itrenjunhua/RRecyclerView: RecyclerView 常用示例,以及 Adapter 和 ItemDecoration 封装...

Android RecyclerView 控件使用Android RecyclerView 控件使用方法及代码示例,以及 RecyclerView 分割线绘制类和 Adapter 的封装。主要包含的代码1.使用不同的RecyclerView.LayoutManger实现不同风格的布局(ListView类型、GridView类型、瀑布流类型)2.给RecyclerView添加分割线3.给 item ...

weixin_29014939的博客 289

android recyclerview adapter封装,Android RecyclerView适配器基类Adapter封装【原创】

Android开发中,列表控件我们经常会使用ListView或者RecyclerView,今天我们来记录一个RecyclerView适配器Adapter的封装基类,public abstract class RecyclerAdapter extends RecyclerView.Adapter>implements View.OnClickListener, View.OnLongClic...

weixin_29698641的博客 752

真实项目运用-RecyclerView封装

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

大城小小爱的博客 630
上一篇: [Android]关于TextView颜色选择器到正确使用——动态添加带有ICON的TextView到TabLayout中
下一篇: [Android]自由添加Head和Foot对RecyclerView的Adapter
runstoppable
博客等级 码龄10年 1粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值