通用ViewHolder工具类:
用法:在需要创建ViewHolder的地方(一般是Adapter中的getView方法内)通过:
ViewHolder viewHolder =ViewHolder.getViewHolder(convertView,context,R.layout.itemLayout);

//如获取TextView的控件
TextView textView = viewHolder.getView(R.id.tv);
//如获取Button控件
Button btn = viewHolder.getView(R.id.btn);

import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;public class ViewHolder {public static ViewHolder getViewHolder(View convertView , Context context, int itemLayout){if(convertView == null){    //在ListView还没复用的时候,convertView为null的,所以需要充气View newConvertView = View.inflate(context, itemLayout, null);return new ViewHolder(newConvertView);//将View传入构造函数,把View设置为成员变量,同时设置一个标签,并返回一个ViewHolder对象}else{return (ViewHolder)convertView.getTag();//当有复用的View时,亦即convertView不为null时,通过标签获取ViewHolder对象}}public final View convertView;public ViewHolder(View convertView){this.convertView = convertView;convertView.setTag(this);}Map<Integer,View>views = new HashMap<Integer,View>();private View getCommonView(int id){ //获取view对象,私有化目的是为了避免其他地方使用的强转麻烦,可以通过getView(id)方法来代替if(views.get(id) == null){Log.i("ViewHolder", "第一次使用");views.put(id, convertView.findViewById(id));}else{Log.i("ViewHolder", "找ViewHolder");}return views.get(id);}public TextView getTextView(int id){//获取TextView对象return (TextView)getCommonView(id);}public ImageView getImageView(int id){//获取ImageView对象return (ImageView)getCommonView(id);}public <T extends View> T getView(int id , Class<T> viewClass){//通过字节码文件来泛型的类型推导return (T)getCommonView(id);}   //T extends View 的作用是:使其返回值的类型只能是View子类,避免使用其它类型时不报错public <T extends View> T getView(int id){//通过返回值类型来泛型的推到return (T)getCommonView(id);}
}

ViewHolder的高级使用相关推荐

  1. 高级Android开发面试汇总

    高级 Android 开发面试题汇总 一. Android 基础 1. Service 的两种启动方式 简单的来说就是 直接启动 和 绑定启动 两种方式. // 直接启动 Context.startS ...

  2. android 高级项目,从零开始的Android新项目8 - Data Binding高级篇

    承接上篇,本篇继续讲解一些Data Binding更加进阶的内容,包括:列表绑定.自定义属性.双向绑定.表达式链.Lambda表达式.动画.Component注入(测试)等. 列表绑定 App中经常用 ...

  3. Android 高级编程 RecyclerView 控件的使用

    RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object    ↳ and ...

  4. Android 高级面试

    一. Android 性能优化 1. 如何对 Android 应用进行性能分析 2. 什么情况下会导致内存泄露 3. 如何避免 OOM 异常 4. Android 中如何捕获未捕获的异常 5. ANR ...

  5. 安卓高级面试知识整理

                                                    安卓高级面试知识整理 Android 四大组件:这是一份全面 & 详细的Activity学习指南 ...

  6. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android基础篇)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  7. Android研发岗必问30+道高级面试题,三面腾讯已拿offer

    前言 回顾一下自己这段时间的经历,三月份的时候,疫情原因公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷.到五月份,公司开始第二波裁员,我决定主动拿赔偿走人 ...

  8. Android高级:内部类的理解,多态,run和start,wait和seelp,线程安全,堆和栈,synchronized 和volatile ,AsyncTask,Binder的机,view的原理

    目录 成员内部类.静态内部类.局部内部类和匿名内部类的理解,以及项目中的应用 哪些情况下的对象会被垃圾回收机制处理掉? Java中实现多态的机制是什么? String为什么要设计成不可变的? Obje ...

  9. Redis 高级特性(4)— 单线程架构

    Redis 使用了单线程架构和 I/O 多路复用模型来实现高性能的内存数据库服务. 1. 单线程模型 开启三个 redis-cli 客户端同时执行命令.客户端 1 设置一个字符串键值对: 127.0. ...

最新文章

  1. 安卓世界微观搏杀激烈,网易云信教你存活绝招
  2. python通过链接下载文件-如何使用Python通过HTTP下载文件?
  3. 如何把 .NET 进程中的所有托管异常找出来?
  4. 我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析
  5. 信息学奥赛一本通(2060:【例1.1】计算机输出)
  6. C语言细节之四: 空指针
  7. 批处理-删除环境变量
  8. Hadoop MapReduce链式实践--ChainReducer
  9. 人工智能+眼科疾病辅助诊断(相关信息搜集)
  10. python函数传入对象
  11. 我的世界java1.16.1怎么弄材质包_我的世界1.16.1透明矿石材质包
  12. Folx Pro5最新版适用Mac电脑网络BT下载器
  13. 1024,身为程序员的我们更应该思考如何放慢脚步
  14. 怎样写好求职简历(STAR法则)
  15. Linux 下man 命令的使用
  16. 运营商大数据怎么获客的?一篇文章告诉你
  17. 模拟京东快递单号查询案例2020/11/24
  18. 【Spring Cloud 2】软件架构设计,Java游戏合集百度云盘
  19. 第四方支付平台哪个好?这类第四方支付或惨遭淘汰
  20. 【沃顿商学院学习笔记】管理学——05腐败对个体企业的影响

热门文章

  1. 【已解决】Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
  2. Json 转 Bson
  3. css媒体查询、rem,适配不同分辨率手机(分享)
  4. 求大于200的最小质数,java
  5. JavaScript可视化——Flot选择图表
  6. 编译 openwrt
  7. 日IP千万,如何解决环境问题
  8. C++11实现高效内存池
  9. 可持续,新机遇, 构建培育钻石产业生态圈——首届中国国际培育钻石产业发展与创新大会盛大举行
  10. python中elasticsearch_dsl模块用法详解