android - 如何避免在 Adapter 类中多次调用 findViewById()?

标签 android performance android-adapter findviewbyid

我正在尝试通过调用 findViewById() 来尽可能加快应用程序的速度在 Adapter 类中尽可能少。

我听说过一种可以创建 HashMap<T> 的“方法”包含 View实例和整数作为值,并将其与适配器的 ViewHolder 一起使用或一起使用内部类。如您所见,我对此知之甚少,也没有机会就此“方式”提出更多问题。

我一直在 Internet 上搜索解决方案,但我不是在使用错误的关键字进行搜索,就是我没有识别出这样的解决方案。

任何人都可以以正确的方式指导我吗?也许有人写了一个关于如何实现这一点的小样本?

编辑 1

我目前的 ListView 没有任何问题因为它已经在使用 ViewHolder图案。提出这个问题的原因是因为我听说使用 HashMap 实际上可以获得更快的速度。模式比使用 ViewHolder图案。我知道这是模糊的描述,但这就是我来这里问的原因。

共享代码根本没有帮助,因为它只是一个使用 ViewHolder 的普通适配器模式,就像您共享的链接中的模式一样。没有任何实验或使适配器变慢的东西。

再说一遍,问这个的主要原因是要找到我们是否有比 ViewHolder 更快的模式

最佳答案

减少调用 findViewById 的数量的方法是使用 ViewHolder“回收” View 。背后的想法是保持膨胀的 View 并在需要时重用它们 - 因为它们已经有 ViewHolders 你不需要进行 findViewById 调用。

正如@nhaarman 在他的回答的最后一部分中所描述的,为 ListView 执行此操作的方法是在 getView 中重用 convertView(如果它不为空)并使用 ViewHolder 中的引用 View 来更新它们。

first link 中描述了一种如何通过 setTag 创建 ViewHolder 并将它们存储在 View 中的方法。 @nhaarman 提供。 然后在 getView 函数中,如果 convertView 不为空,则调用 getTag 以取回 ViewHolder。

在另一个注释中,您应该查看 RecyclerView这是一个强制执行 ViewHolder 模式的 ListView 。

关于android - 如何避免在 Adapter 类中多次调用 findViewById()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686666/

相关文章:

android - 如何使用 ADB 获取主屏幕中所有应用程序的列表

java - 为什么我不能在 AppCompatActivity 的函数外部使用 create 方法

performance - NHibernate select指数增长缓慢

c++ - 如何获取当前进程的 Windows 性能计数器

java - ListView/SimpleAdapter 不刷新 - Android

java - Android Web 应用程序更新

android - OpenglES 2.0 PNG alpha 纹理重叠

javascript - javascript编译器读取一行代码的方式

java - 如何处理android中 ListView 项中的复选框事件

android - 快速向上和向下滚动时,ListView 交替行颜色错误