通用viewHolder设计,通用Adapter设计,解决简单的listview显示

问题记录(未解决)——RecyclerView适配器中的泛型指定 学习了ListView控件之后,接着开始了RecyclerView控件的探索,在学习得过程中发现了些不理解的问题,贴出代码和问题做些记录。 这是RecyclerView的适配器部分 没有贴出的部分有Brother类(定义了照片和姓名) 主布局和子项布局 主方法 public class BrotherAdapter extends RecyclerView.Adapter<Brother... 阅读详情
通用Adapter设计首先需要一个viewHolder来解决convertView的复用和findviewbyid次数,废话不多说直接上代码。



public class CommentViewHolder {

     //使用单例模式避免多个静态类
    public static CommentViewHolder getCommentViewHolder(Context context, View convertView, int resource) {

        if (convertView == null) {

            convertView = View.inflate(context, resource, null);
            return new CommentViewHolder(convertView);
        } else {

            return (CommentViewHolder) convertView.getTag();
        }
    }

    public View convertView;

    // 对成员变量赋值,并把当前CommentViewHolder用tag存起来以便复用
    public CommentViewHolder(View convertView) {

        this.convertView = convertView;
        convertView.setTag(this);
    }

    //集合封装View,SparseArrayView类似于hashMap,是Google专门提供用来处理key值为Integer类的双列数组,效率更高
    private SparseArray<View> mViews = new SparseArray<View>();

    //根据xml的控件的资源id从集合里面取出对应控件
    public <T extends View> T getView(int resId) {

        View view = mViews.get(resId);
        if (view == null) {

            view = convertView.findViewById(resId);
            mViews.put(resId, view);
        }
        return (T) view;
    }

   //根据泛型,指定view的类型
    public <T extends View> T getView(int resId, Class<T> type) {

        View view = mViews.get(resId);
        if (view == null) {

            view = convertView.findViewById(resId);
            mViews.put(resId, view);
        }
        return (T) view;
    }
   //2个常用的view,简单处理一下对外提供出来
    public TextView getTextView(int resId) {

        return getView(resId, TextView.class);
    }

    public ImageView getImageView(int resId) {

        return getView(resId, ImageView.class);
    }
}
viewHolder写好了然后就是Adapter了,回想一下我们一般写个简单的Adapter,只有传入数据集合(数组)和getView是不一样的,其它基本一样,所以只需要报这2个暴露出来就好。
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.wingsofts.slidedelete.CommentViewHolder;

import java.util.List;

/**
 * Created by SingleView on 2017/5/8.
 */

public abstract class CommonAdapter<T> extends BaseAdapter {
    Context context;
    //传入的集合不一样,所以这里也要用泛型
    List<T> list;
    //每个item自己的布局文件
    int layoutId;
    //通过构造方法赋值
    public CommonAdapter(Context context, List<T> list, int layoutId) {
        this.context = context;
        this.list = list;
        this.layoutId = layoutId;
    }

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

    @Override
    public T getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        CommentViewHolder commentViewHolder = CommentViewHolder.getCommentViewHolder(context, convertView, layoutId);
        T t = list.get(position);
        //我们可能需要对里面view做事件处理所以把对象和commentViewHolder用抽象方法暴露出去
        handlerView(t, commentViewHolder,position);
        return commentViewHolder.convertView;
    }

    public abstract void handlerView(T t, CommentViewHolder viewHolder,int position);
}
大功告成,然后使用的时候继承CommonAdapter实现handlerView就行(handlerview立面处理逻辑),或者你还是嫌麻烦,可以直接new第一个实现类
如下:
 commonAdapter = new CommonAdapter<RechargeRecordBean>(this, list, R.layout.item_recharge_recode) {
                @Override
                public void handlerView(RechargeRecordBean rechargeRecordBean, CommentViewHolder viewHolder,int position) {
                    TextView textRechargeMoney = viewHolder.getTextView(R.id.tv_recharge_money);
                    
                    String rechargeMoney = rechargeRecordBean.getUndesirableAmount();
                  
                 textRechargeMoney.setText(StringUtil.replaceNull(rechargeMoney));
}; }
几行就搞定了,是不是很简单,如有任何疑问不足,欢迎留言指教,交流。



        
简单案例理清Adapter、ViewHolder和RecyclerView之间的关系 虽然ListView功能很强大,但是也有很多缺点。比如说性能差、扩展性不好等 为此,Android5.0之后提供了一个更强大的滚动控件——RecyclerView,可以说是一个增强版的ListView,优化了ListView的各种不足。 注:本文将以kotlin代码的方式编写,我会尽量写上注释,如有不懂可以提问! 今天先写一个简单的案例,目的在于理清关系;如后期有机会的话,再写一个优化后的复杂案例给大家。 案例之前先介绍一下各自的任务,以便理解: RecyclerView: 用户滑动屏幕切换视图时,上一个视 阅读详情

相关推荐

安卓--ListView和Adapter的关系和如何使用实例

说在前面: 在做联系人列表和消息列表之类的时候经常用到listview和adapter,相信代码都会写,往上的例子也多的数不胜数,我搜了一下介绍listview和adapter之间关系的博文并不多,说的详细的更少,今天就把我对他们之间关系的理解说一说,说不明白就直接上图;再加上一个例子来说明怎么用。 1.listview和adapter之间的关系: 我喜欢安卓字面意思理解,listview就

ZKeeer的专栏 4873

泛型应用之打造Android万能ViewHolder-超简洁写法

http://blog.youkuaiyun.com/linglongxin24/article/details/52808656 Java泛型应用之打造Android万能ViewHolder-超简洁写法 标签: androidjava泛型ViewHolderListView 2016-10-15 09:59 829人阅读 评论(2) 收藏 举报  分类: 每

安卓加油 386

ListView的Adapter有多个ViewHolder的时候导致的ViewHolder类型转换错误!

问题复现 背景是这样的,我用的CursorAdapter,然后重写了getViewTypeCount方法 @Override public int getViewTypeCount() { return TYPE_COUNT; } 我又自己实现了一个getItemViewType方法 public int getItemViewType(Cursor

YanRu的专栏 3516

RecycleView一个Adapter中使用多个不同Holder时 泛型参数冲突解决办法

方法一 :让不同holder继承于一个抽象Holder(最好设置泛型 这样可以为不同holder赋不同类型的数据) 如下 import android.view.View; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myapplication.date.FeedDate; public abstract class BaseHolde

Azadoo的博客 749

Android ListView自定义Adapter实战:复用、内存与动态刷新

ListView是Android早期核心列表控件,其Adapter机制虽被RecyclerView取代,但在老旧系统兼容、低资源设备及存量政务/医疗类App中仍具不可替代性。理解Adapter底层原理——尤其是getView复用逻辑、ViewHolder生命周期管理、notifyDataSetChanged线程安全与数据绑定解耦——是保障列表性能与稳定性的技术基石。本文聚焦Custom Adapter工程实践,深入剖析convertView精准复用、静态ViewHolder防内存泄漏、单Item局部刷新等关

weixin_33862993的博客 398

Android高效列表开发:通用ViewHolder与Adapter实战

ViewHolder的实现始于一个关键的设计决策:将其定义为Adapter内部的静态内部类。之所以强调“静态”,是因为非静态内部类会隐式持有外部类(即Adapter)的引用,从而延长其生命周期,容易引发内存泄漏。正确的定义方式如下:// 静态内部类,不持有外部类引用@Override} else {在这段代码中,ViewHolder被声明为static,确保其独立于实例存在。四个成员变量分别对应布局中的控件,初始化后通过。

weixin_42113456的博客 1130

将DataBinding整合到ViewHolder的一种极简方式

自从DataBinding和ViewBinding出现后,Android开发中获取界面元素就变得非常方便。而本文主要介绍一种极简的方式在ViewHolder中利用ViewBinding/DataBinding

乐征skyline 941

Android ViewHolder的超简洁写法Demo

android ViewHolder的超简洁写法,不用为每个adapter都创建一个ViewHolder类

史上最强RecyclerView封装,泛型、反射、注解3大终极技能齐出

封装后的效果,比如写一个NewAdapter@LayoutId(id = R.layout.item) public class NewsAdapter extends CommonAdapter&lt;String&gt;{ @DataSource List&lt;String&gt; list = Arrays.asList("我","是","大","帅","哥&q

qq_36523667的博客 901

基于Android平台下的健康管理APP/基于android的健康管理系统

随着网络科技的发展,移动智能终端逐渐走进人们的视线,相关应用越来越广泛,并在人们的日常生活中扮演着越来越重要的角色。因此,关键应用程序的开发成为影响移动智能终端普及的重要因素,设计并开发实用、方便的应用程序具有重要的意义和良好的市场前景。Android技术作为当前最流行的操作平台,自然也存在着大量的应用服务需求。 本课题研究的是基于Android技术平台的健康管理APP,开发这款健康管理APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了健康管理APP的界面设计及使用,主要包括界面的

m0_73706453的博客 1440

Windows下Python多版本共存与切换的终极指南(含环境变量详解)

本文详细解析了在Windows系统下实现Python多版本共存与切换的完整方案。通过深入讲解环境变量Path的底层机制,提供了从安装策略、精细化Path管理到创建快速切换脚本的实战指南,并介绍了py启动器和虚拟环境等高级技巧,帮助开发者彻底解决版本冲突问题,提升开发效率。

v6b7n8m9q0的博客 538

android 封装通用Adapter、ViewHolder实现ListView多条目混排

先看下效果图 【引入】  我们一般编写listView的时候顺序是这样的:  •需要展示的数据集List  •为这个数据集编写一个ListView  •为这个ListView编写一个Adapter,一般继承自BaseAdapter  •在BaseAdapter内部编写一个ViewHolder类,对应ListView里面的item控件,提高控件的查询效率  分析: Li

LXYNLYXY的博客 1638

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6692

ListView中convertView和ViewHolder的工作原理

LsitView和Adapter 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html 工作原理:  1.ListView针对List中每个item,要求adapter给我一个视图(getView)  2.一个新的视图被返回并显示 如果我们有上亿个item要显示怎么办?为每个项目创建一个新视图?NO

以现在的努力程度之低,谈狗屁的未来,屎的梦想!!! 6万+

Ubuntu安装opencv4.5(自己安装过程详细)

1.下载opencv 在opencv官网下载source版,下载链接 http://opencv.org/releases.html。别下载错版本 下载过程就不多说了。 2.安装过程 2.1解压 unzip opencv-4.5.0.zip cd opencv-4.5.0 2.2安装依赖的库 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-

weixin_45629790的博客 1万+

化工设计软件:AutoCAD Plant 3D二次开发_(1).AutoCADPlant3D概述

AutoCAD Plant 3D 是一款专为化工行业设计的三维工厂设计和建模软件。它基于AutoCAD平台,提供了强大的三维建模功能和专业的化工设计工具,帮助工程师和设计师在工厂设计过程中提高效率和准确性。AutoCAD Plant 3D不仅能够创建详细的三维模型,还可以进行管道设计、设备布置、支架设计等复杂任务。通过上述案例,我们可以看出 AutoCAD Plant 3D 在化工厂设计中的强大功能和优势。该软件不仅提供了丰富的建模工具和专业的设计功能,还支持二次开发,使用户能够根据具体需求进行定制化操作。

kkchenjj的博客 1108

ListView的优化使用-抽取ViewHolder以及adapter类

我们先做一些事先的准备代码: 1.首先是就是listview的item布局:listview_item.xml代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:padding="10d

梦的彼岸花 740

OpenMM | PDBFixer 用于蛋白质预处理

PDBFixer 用于蛋白质预处理

DrugOne 3007

Adapter优化(二)通用ViewHolder

一、背景 在上一篇介绍了Adapter的convertView和ViewHolder机制,相信也是现在开发中常用的模式。面对比较大的应用程序,往往有很多的ListView、GridView,也就需要很多的Adapter和ViewHolder类,假如页面需求修改,要修改的代码量也是个大工程。 于是,通用的ViewHolder类和万能Adapter应运而生。我个人一开始了解到其中的思路,深深被原创

远方不远 678

FreeRTOS全攻略:从入门到精通

本文聚焦 FreeRTOS,从基础概念出发,阐述其开源、轻量级等优势。着重介绍 FreeRTOS 入门知识,涵盖内存管理、任务操作、同步互斥机制等核心内容。其中,空闲任务与钩子函数保障系统基础运行与功能扩展;队列、信号量、互斥锁和事件组等机制,分别从数据传递、资源访问控制、优先级问题解决及多任务同步等方面,为开发者提供高效的任务间协作与资源管理方案,助力开发者掌握 FreeRTOS 核心技术,为嵌入式项目开发筑牢基础。

邓邓子的博客 6360

LeRobot 入门教程(五)异步推理

本文介绍了基于SmolVLA的异步推理技术在机器人控制中的应用。通过将动作预测与执行解耦,异步推理消除了传统同步推理中的等待延迟,使机器人行为更加流畅。文章详细讲解了如何安装依赖、启动策略服务器和机器人客户端,并重点说明了关键参数actions_per_chunk和chunk_size_threshold的调整方法。实验表明,异步推理能显著提升机器人响应速度,特别适合大规模模型应用。最后,文章建议用户根据具体硬件和任务需求优化参数配置,以获得最佳性能。

2506_90492529的博客 1644

Android之ListView的Adapter的复用

Android之ListView的Adapter的复用

不能说的秘密的博客 5297

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android通用的Adapter,或许你用我这一个就够了

public int getCount(){return mDatas.size();}@Overridepublic Object getItem(int position){return mDatas.get(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic View getView(int position, View convertView, ViewGroup paren

2501_90257609的博客 798

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

RecyclerView、Adapter和ViewHolder

RecyclerView是ListView的升级版,强化了ListView的某些不足。比如listView如果不使用一些技巧的话,listView的性能就会非常差;ListView只能实现纵向滚动的效果等。顾名思义,ViewHolder只做一件事:容纳View视图RecyclerView自身是不会创建视图,它创建的是ViewHolder,而ViewHolder引用这一个个itemView如下图:R...

Cdaimadada的博客 906

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android listview 获取viewholder,Android ViewHolder 的基本使用

标签: Android Adapter ViewHolderAdapter 的理解Adapter :适配器,因为 ListView 是一个 View ,不能添加子项,因此在呈现数据的时候就需要某种工具将数据呈现在 ListView 上,而 Adapter 就能充当此角色。常用的 Adapter:ArrayAdapter、BaseAdapter等。ViewHolder 的理解要想使用 ListVie...

weixin_29192365的博客 1517

android listview 不显示_Android通用的Adapter,或许你用我这一个就够了

一、概述相信Android开发,特别是电商项目开发,使用RecyclerView、ListView、GridView是正常不过的了。一个项目下来,基本就是一直在写Adapter。刚开始写Adapter觉得没什么,无非就是ListView的继承BaseAdapter复写几个方法,getView里面使用ViewHolder模式;RecyclerView的就继承 RecyclerView.Ad...

weixin_30803191的博客 531
下一篇: android开发 Java在指定的位置插入字符
SingleView
博客等级 码龄10年 2粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值