什么developer.android.com在谈论RecyclerView

问候,亲爱的哈拉兹特里! 这篇帖子促使我写了一篇文章(或者更确切地说,是该区域局部温度急剧升高……嗯,腰下部的感觉,通常是在互联网上出现错误时才会发生)。


让我们从头开始。 我完全同意“活动的生命周期与RecyclerView的工作之间存在某些共同点” –这就是“某件事” –需要了解我们在做什么以及为什么这么做。 并阅读文档。 未能实现这两个必需品(如理性梦想)会产生怪物。 仅在这里,以先前的作者提出的与这些怪兽作斗争的方式,我强烈不同意。


考虑2个条件。


条件编号次


如果您在某个地方挂了一个监听器,那么在其他地方应该断开它的连接。 通常,它们使用对称函数执行此操作-附加到onViewAttachedToWindow ,将其删除到onViewDetachedFromWindow 。 我们附加在onBindViewHolder ...我们不附加在onBindViewHolder 。 该调用不是对称的,可以根据不同条件多次调用。 无需使您的生活复杂化。


如果您像原始文章的作者一样有这样的想法: “但是在某些情况下,...在侦听器中有必要考虑元素在列表中的位置,可以在onBindViewHolder()方法中访问该元素的位置,而在onViewAttachedToWindow()中不存在该元素的访问权限” ,然后驱动它考虑一下。 你做不到 即使您真的想要。 如文档中所述,如果仅更改元素的位置而不更改其内容,则不会调用此方法,因此我们冒着在侦听器中获取错误位置的风险。 使用getAdapterPosition


第二条件


RecyclerView是一件相当复杂的事情。 无需使您的生活更加复杂。 如果您不参与性能优化, 那么此元素是否在常规池中无关紧要。


结果


在这两种情况下,您不太可能需要以viewWasRecycled标志的形式重新viewWasRecycled


这是怎么回事?


通常, RecyclerView中的元素会发生什么? 首先,请记住,有两个“存储库” —缓存和池。 如果一个元素超出了屏幕的边界,它将进入缓存,但是可以在任何时候再次返回-甚至无需重新链接此元素(即, 不会调用onBindViewHolder方法)。 如果缓存已满,或者由于某些其他原因, RecyclerView决定我们在不久的将来不需要此元素,它将进入该池(在onViewRecycled将调用onViewRecycled )。 从池中恢复的项目将被重新链接(因为它的位置很可能已更改),我们将收到一个onBindViewHolder调用。 但是,如果元素已离开池,则新元素将经历整个周期onBindViewHolderonViewAttachedToWindowonViewAttachedToWindow


总计,我们为活动的发展提供了3种选择:


  • 之前没有元素:我们创建,附加,附加;
  • 该项目在池中:绑定,附加;
  • 该项目在缓存中:只需附加即可。

在哪里以及如何?


元素在哪个阶段和哪个阶段更好?


  • onCreateViewHolder 。 创建,嗯, ViewHolder 。 无需绑定侦听器,将其填充内容等。 只需确定我们需要的类型并创建它即可。
  • onBindViewHolder 。 我们执行实际的内容绑定-文本,图像。 position参数只能在方法本身中使用-我们不会保存它,也不会将其发送给闭包,请记住,如果数据已更改,则将再次调用此方法(如果仅更改了位置,则不会执行此操作)。 出于对称性考虑,我也不会在这里悬挂监听器。
  • onViewAttachedToWindow 。 现在,该元素将在屏幕上可见,用户将能够与该元素进行交互-这是连接侦听器的好时机。 请记住,如果我们需要元素在其中的位置,则可以通过getAdapterPosition获得它。
  • onViewDetachedFromWindow 。 该项目将不会显示在屏幕上。 用户将无法与他互动。 删除侦听器。
  • onViewRecycled 。 项目已发送至 地狱 池子 您可以在此处释放大量资源(例如,缓存的图片)。 如果该元素将被重用-那么很可能是在另一个位置。

好像就这些了。 我希望我没有忘记或混淆任何事情,但是如果有什么事,请戳一下鼻子,不要害羞。

Source: https://habr.com/ru/post/zh-CN430812/


All Articles