9.Android 万能ViewHolder

  • Android 万能ViewHolder

    • ViewHolder的作用
    • 万能ViewHolder的原理
    • 在你的BaseListAdapter中可以这么实现

ViewHolder的作用

Adapter的getVIew()以得到旧视图(convertView):

    /*** Get a View that displays the data at the specified position in the data set. You can either* create a View manually or inflate it from an XML layout file. When the View is inflated, the* parent View (GridView, ListView...) will apply default layout parameters unless you use* {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}* to specify a root view and to prevent attachment to the root.* * @param position The position of the item within the adapter's data set of the item whose view*        we want.* @param convertView The old view to reuse, if possible. Note: You should check that this view*        is non-null and of an appropriate type before using. If it is not possible to convert*        this view to display the correct data, this method can create a new view.*        Heterogeneous lists can specify their number of view types, so that this View is*        always of the right type (see {@link #getViewTypeCount()} and*        {@link #getItemViewType(int)}).* @param parent The parent that this view will eventually be attached to* @return A View corresponding to the data at the specified position.*/View getView(int position, View convertView, ViewGroup parent);

看过精致Adapter都知道,ListView的一个Item移出屏幕的范围,和一个Item进入屏幕的范围的时候,Adapter的getView(int position, View convertView, ViewGroup parent)里都能得到这个Item的View,也就是上述所说的旧视图(convertView) 。ListView的的Item如果样式都是一样的话,我们可以拿到旧视图的View,然后根据ViewId上的去取得组件并修改其内容,然后return该View。达到复用的效果。所以这里,涉及到了ViewHolder去保存该View上组件的各个ViewId,并且将ViewHolder继续保存到return的convertView的tag中,以供下一次拿到convertView时取得,规避了ViewHolder的不断创建,也实现了ViewHolder的复用。

其实findViewById()的性能是很低的,引入ViewHolder的目的也是为减少getView()时findViewById()的次数。

万能ViewHolder的原理

类似于内部存放了一个字典,用于根据ViewId得到View。

    public class ViewHolder {private final SparseArray<View> views;private View convertView;public ViewHolder(View convertView) {this.views = new SparseArray<>();this.convertView = convertView;}public <T extends View> T findViewById(int viewId) {View view = views.get(viewId);if (view == null) {view = convertView.findViewById(viewId);views.put(viewId, view);}return (T) view;}}

在你的BaseListAdapter中可以这么实现

public abstract View getView(int position, View convertView, ViewHolder viewHolder);@Overridepublic final View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView = mInflater.inflate(getItemLayout(), null);viewHolder = new ViewHolder(convertView);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}try {return getView(position, convertView, viewHolder);} catch (Exception e) {e.printStackTrace();}return convertView;}

这样的话可以让BaseListAdapter的子类强制继承getView然后与BaseListAdapter的getView对接后续操作。相当于执行了:BaseListAdapter.getView() -> BaseListAdapter子类.getView()

9.Android 万能ViewHolder相关推荐

  1. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  2. Android 万能适配器BaseQuickAdapter操作及免费源码

    Android 万能适配器BaseQuickAdapter操作及免费源码,本篇巨长无比,非常详细的介绍了BaseQuickAdapter,若有帮助到您,记得点个赞哦~ 简介 导入依赖 简单使用 添加头 ...

  3. 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

    前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over1 ...

  4. Android listview viewholder

    2019独角兽企业重金招聘Python工程师标准>>> Android ListView ViewHolder 利用adapter中的getView的 contentView 的复用 ...

  5. Vitamio打造自己的Android万能播放器

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  6. 使用Vitamio打造自己的Android万能播放器(1)——准备

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  7. 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

    前言 本章将实现非常实用的功能--下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...

  8. [转载]使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)...

    前言 本章将实现非常实用的功能--下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...

  9. 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...

最新文章

  1. C# richtextbox 自动下拉到最后 方法 RichTextBox读取txt中文后出现乱码
  2. 工作后越来越觉得,丢什么也不能丢账号!
  3. iframe 返回上一页_寻找高颜值小姐姐难吗!直到我在Github上发现了这个Python库
  4. 10g TNS 13541 监听错误 tnsping可以但是conn system/manager@mult1.net 报错
  5. java 编译器获得型号_关于编译器构造:如何找到已编译类的目标Java版本?
  6. linux学习项目,[ Linux运维学习 ] 路径及实战项目合集
  7. Android数据绑定框架DataBinding用法
  8. 总结面试时没有回答上的内存对齐问题
  9. 百度一口气亮出NLP十年积累:完整技术布局全面披露,面向业界砸下11项七夕大礼
  10. div 图片滚动 / 文字滚动
  11. LeetCode 461. Hamming Distance
  12. 牛客xiao白月赛32-- 拼三角(暴力却有坑)
  13. 23种设计模式(2)-工厂模式
  14. 沪江、外研社、新东方联合组建海外出版公司,AI 背景下的出版业将去何处?...
  15. linux安装matlab(亲测有用)
  16. 清华刘云浩教授回复学生2000问,你想了解的人工智能问题可能都在这里
  17. 阿里研究员吴翰清:世界需要什么样的智能系统?
  18. 基于8086方波锯齿波三角波发生器仿真、基于8086的LCD1602显示仿真设计、基于8086的LED点阵汉字流水显示设计、基于8086的LED中文显示屏显示设计-仿真设计资料【转发】
  19. 外贸常用术语_外贸跟单常用术语
  20. 信息学奥赛一本通 1296:开餐馆(evd)

热门文章

  1. docker安装nextcloud+onlyoffice+https
  2. jdbc.properties 系统找不到指定路径问题
  3. 微价值:专访个人开发者800万用户之《系统清道夫》
  4. 我们该怎么样看待人工智能?
  5. cs起源本地服务器无响应,CS起源上为什么我无法进入有反作
  6. ElasticSearch 命令
  7. Qt制作简单标签云(上)
  8. BCH硬分叉完毕,澳本聪放话:一切尚未结束,游戏继续!
  9. DirectX学习笔记(十五):粒子系统实现
  10. 【唐诗学习】四、边塞诗派代表