摘要:我们知道在一般的列表视图中绑定不同类型的列表项子视图是通过各种类型的比如不同数据对不同视图控件的操作是以实现各种子类的方式实现的能不能只用一种类型的视图来涵盖所有的类型听起来有些不可思议每种需要绑定的控件千差万别怎么抽象这些控件呢但实际上是
我们知道在一般的列表视图(recyclerView)中绑定不同类型的列表项子视图是通过各种类型的ViewHolder(比如recyclerView.ViewHolder). 不同数据对不同视图控件的操作是以实现各种ViewHolder子类的方式实现的.
能不能只用一种类型的视图来涵盖所有的ViewHolder类型? 听起来有些不可思议, 每种ViewHolder需要绑定的控件千差万别, 怎么抽象这些控件呢? 但实际上是可以实现的.
在support.v7.preference库中作者就用了一种方式实现这种效果:
public class PreferenceViewHolder extends RecyclerView.ViewHolder { private final SparseArraymCachedViews = new SparseArray<>(4); public View findViewById(@IdRes int id) { final View cachedView = mCachedViews.get(id); if (cachedView != null) { return cachedView; } else { final View v = itemView.findViewById(id); if (v != null) { mCachedViews.put(id, v); } return v; } } }
这样外部只需通过findViewById来找到各种各样的控件实例来进行数据绑定即可, 但是声明的ViewHolder却只需一种! 仔细想想这种通过SparseArray持有的方式其实非常巧妙, 真正将ViewHolder作为各种视图的持有者(Holder)不用再区分类型, 可谓实至名归.
稍加改造就可以和新API的findViewById风格完全保持一致(我们姑且叫做ItemViewHolder, 抽象所有列表视图子视图):
public class ItemViewHolder extends RecyclerView.ViewHolder { private final SparseArrayCompatmCached = new SparseArrayCompat<>(10); public ItemViewHolder(View itemView) { super(itemView); } public T findViewById(@IdRes int resId) { int pos = mCached.indexOfKey(resId); View v; if (pos < 0) { v = itemView.findViewById(resId); mCached.put(resId, v); } else { v = mCached.valueAt(pos); } @SuppressWarnings("unchecked") T t = (T) v; return t; } }
其实RecyclerView.ViewHolder本身就应该设计成这种方式, 并且声明成final强制移除各种Viewholder类型的强转.
所以还是要多看官方成熟的库, 他们的设计和实现都是经过千锤百炼, 对学习非常有益处.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/14988.html
摘要:有鉴于此,循环视图的适配器把视图持有者的重用逻辑剥离出来,由系统自行判断并处理持有者的重用操作。至此本节的适配器实现过程终于落下帷幕,一路上可谓是过五关斩六将,硬生生把数十行的代码压缩到不到十行的代码,经过不断迭代优化方取得如此彪炳战绩。前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看...
摘要:方法根据子项所处的位置判断具体类型并返回。调用方法解除子项与之间的关联。自定义适配器适配器继承自,并将泛型指定为内部类。使用支持多种布局方式借助能够灵活地将列表控件放入不同的容器。 ListView 和 RecyclerView 最常用和最难用的控件 由于手机屏幕空间有限,无法显示全部内容。当有大量数据需要展示的时候,借助列表控件。通过手指上下滑动,使得屏幕内外的数据不断进出。 最基本...
摘要:方法根据子项所处的位置判断具体类型并返回。调用方法解除子项与之间的关联。自定义适配器适配器继承自,并将泛型指定为内部类。使用支持多种布局方式借助能够灵活地将列表控件放入不同的容器。 ListView 和 RecyclerView 最常用和最难用的控件 由于手机屏幕空间有限,无法显示全部内容。当有大量数据需要展示的时候,借助列表控件。通过手指上下滑动,使得屏幕内外的数据不断进出。 最基本...
摘要:缺点自动装箱的存在意味着每一次插入都会有额外的对象创建。对象本身是一层额外需要被创建以及被垃圾回收的对象。相较于我们舍弃了和类型的放弃了并依赖于二分法查找。 目录介绍 25.0.0.0 请说一下RecyclerView?adapter的作用是什么,几个方法是做什么用的?如何理解adapter订阅者模式? 25.0.0.1 ViewHolder的作用是什么?如何理解ViewHolder...
阅读 1441·2021-10-13 09:39
阅读 2981·2021-10-12 10:11
阅读 395·2021-09-28 09:36
阅读 326·2021-09-04 16:45
阅读 2443·2019-08-30 15:55
阅读 1245·2019-08-30 13:04
阅读 497·2019-08-29 17:08
阅读 1753·2019-08-29 14:14