你还在写麻烦的Adapter吗

2024-06-16 12:38
文章标签 adapter 麻烦

本文主要是介绍你还在写麻烦的Adapter吗,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



前言

自从 Android 的 RecyclerView 组件发布以来,RecyclerView 成为了 Android 开发中实现容器视图的首选。要实现一个 RecyclerView,必须为其提供一个 RecyclerView.Adapter。我们来看看一个普通 Adapter 的写法:

public class CommonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private final List<String> list;public CommonAdapter(List<String> sampleData) {this.list = sampleData;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View item = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);return new ViewHolder(item);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (holder instanceof ViewHolder) {((ViewHolder) holder).bindData(list.get(position));}}@Overridepublic int getItemCount() {return list.size();}public static class ViewHolder extends RecyclerView.ViewHolder {private TextView text;public ViewHolder(View itemView) {super(itemView);text = (TextView) itemView.findViewById(R.id.textView);}public void bindData(String data) {text.setText(data);}}
}
这段代码已经十分简单了,但它目前只包含一种类型的 ItemView,当我们需要更多不同的 ItemView 时,需要添加新的 ViewHolder 并更改 onCreateViewHolder() 和 onBindViewHolder() 函数下的代码。

这暂且来说还没有什么大碍。但是当你要实现另外一个类似的 Adapter 时,假设里面有一些在旧 Adapter 中已经出现过的 ItemView,你会发现你没有办法复用之前写过的代码,你只能重新定义一个 Adapter 类并复制旧的 ViewHolder 代码到新的 Adapter 上。这执行起来十分机械,并且当某个 ItemView 发生更改时,你需要同步更改所有对应 Adapter 中的 ViewHolder。


我们需要做点工作把 ViewHolder 代码从 Adapter 中抽离并独立出来,而 ItemPool 能帮你完成这点工作。



ItemPool

使用 ItemPool 后,我们把写 ViewHolder 改变成了写 Item。不同的 Item 用来将不同类型的 Data 映射到相应的 ItemView 上。更重要的是,这些 Item 是可复用的,这意味着你在另外一个 RecyclerView 中也能直接使用该 Item。一个经典的 Item 如下:

public class TestItem extends Item<String> {TextView textView;@NonNull@Overridepublic View onCreateItemView(@NonNull LayoutInflater inflater, @NonNull ViewGroup parent) {View itemView = inflater.inflate(R.layout.item_test, parent, false);textView = (TextView) itemView.findViewById(R.id.textView);return itemView;}@Overridepublic void onBindItem(@NonNull final RecyclerView.ViewHolder holder, @NonNull String s, ItemEventHandler eventHandler) {textView.setText(s);}
}

上面除去 IDE 自动生成的代码,实际上仅仅需要自己写 5 行代码。这个 Item 通过 onCreateItemView() 函数来生成某个 ItemView,并挂钩了 String 这个数据类型,然后通过 onBindItem() 函数来将 String 类型的数据传递给 ItemView 进行视图更新。

好的,接下来我们可以给某个 RecyclerView 组装 Item 了,它看起来是这样的:

ItemPool items = new ItemPool();
items.addType(TestItem.class);
items.addType(TestItem2.class);items.add(new Header());
items.add("A");
items.add("B");items.attachTo(recyclerView);

可以看出来我们并不要再写 Adapter 了,甚至也不用额外定义一个 DataList 了,它通过以下的工作流程来生成对应的 ItemView:

简而言之就是将指定类型的数据用指定类型的 Item 来展示。这十分容易理解,你只要记住哪个 Item 对应哪个数据类型,并往 ItemPool 中塞数据就行了。

更详细的描述可以移步 README 文档。



末尾

当然,它并不是万能的,一些情况下依然推荐使用 Adapter 实现。但不管怎样,大多数情况下你都能用它,并且为你减少几杯咖啡的工作时间~

(≡ω≡.)

作者:nekocode
链接:http://zhuanlan.zhihu.com/p/22146783
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

这篇关于你还在写麻烦的Adapter吗的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066473

相关文章

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。

【扩散模型(十)】IP-Adapter 源码详解 4 - 训练细节、具体训了哪些层?

系列文章目录 【扩散模型(一)】中介绍了 Stable Diffusion 可以被理解为重建分支(reconstruction branch)和条件分支(condition branch)【扩散模型(二)】IP-Adapter 从条件分支的视角,快速理解相关的可控生成研究【扩散模型(三)】IP-Adapter 源码详解1-训练输入 介绍了训练代码中的 image prompt 的输入部分,即 i

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(参数化的适配器)

 示例:可插入的Adapter(参数化的适配器) 实现: c)、参数化的适配器 用一个或多个模块对适配器进行参数化。模块构造支持无子类化的适配。一个模块可以匹配一个请求,并且适配器可以为每个请求存储一个模块。 在本例中意味着,TreeDisplay存储的一个模块用来将一个节点转化成为一个GraphicNode,另外一个模块用来存取一个节点的子节点。   例如,当对一个目录

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(使用代理对象)

 示例:可插入的Adapter(使用代理对象) 实现: b)、使用代理对象 在这种方法中,TreeDisplay将访问树结构的请求转发到代理对象。TreeDisplay的客户进行一些选择,并将这些选择提供给代理对象,这样客户就可以对适配加以控制,如下图所示。 例如,有一个DirectoryBrowser,它像前面一样使用TreeDisplay。DirectoryBrows

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(使用抽象操作)

 示例:可插入的Adapter(使用抽象操作) 说明: 当其他的类(如A)使用一个类(如C)时,如果所需的假定条件越少,这个类(如C)就更具可复用性。如果将接口匹配构建为一个类(如B),就不需要假定对其他的类可见的是一个相同的接口(如C接口)。也就是说,接口匹配使得我们可以将自己的类(如C)加入到一些现有的系统中去,而这些系统对这个类(如C)的接口可能会有所不同。 A  =〉 C

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:绘图编辑器

 示例:绘图编辑器 说明: 有时,为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配。 例如,有一个绘图编辑器,这个编辑器允许用户绘制和排列基本图元(线、多边型和正 文等)、生成图片和图表。这个绘图编辑器的关键抽象是图形对象。图形对象有一个可编辑的形状,并可以绘制自身。图形对象的接口由一个称为Shape的抽象类定义。绘图编辑器为每一种图形对

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:适配器接口

 示例:适配器接口 说明: (1)、定义 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 (2)、结构 对象匹配器依赖于对象组合,如下图所示。 目标Target:定义Client使用的与特定领域相关的接口。 适配器Adapter:对Adaptee的接口与Target接口进行适配。 被适配者A

R-Adapter:零样本模型微调新突破,提升鲁棒性与泛化能力 | ECCV 2024

大规模图像-文本预训练模型实现了零样本分类,并在不同数据分布下提供了一致的准确性。然而,这些模型在下游任务中通常需要微调优化,这会降低对于超出分布范围的数据的泛化能力,并需要大量的计算资源。论文提出新颖的Robust Adapter(R-Adapter),可以在微调零样本模型用于下游任务的同时解决这两个问题。该方法将轻量级模块集成到预训练模型中,并采用新颖的自我集成技术以提高超出分布范围的鲁棒性

Segment Anything Model(SAM)中的Adapter是什么?

在META团队发布的Segment Anything Model (SAM) 中,Adapter 是一种用于提升模型在特定任务或领域上的性能的机制。具体来说,SAM 是一个通用的分割模型,能够处理多种不同类型的图像分割任务,而 Adapter 的引入是为了更好地让模型适应不同的任务需求。 Adapter 的主要功能是: 模块化设计:Adapter 是一种小规模的、可插拔的网络模块,可以在不改

canal adapter支持Elasticsearch 5.X版本配置

日常踩坑,现在公司使用的ES还是5.3.3版本,但是canal目前只支持6.X以上版本,canal是这么建议的: canal adapter 的 Elastic Search 版本支持6.x.x以上, 如需其它版本的es可替换依赖重新编译client-adapter.elasticsearch模块 一般人理解似乎只需要改动依赖版本然后打包就O了,但是启动会报错,后面定位是transpor