更改RecyclerView中项目UI的最有效方法是什么?

时间:2016-07-04 23:21:40

标签: android android-recyclerview

假设我有数百个项目的RecyclerView。有几种不同的视图类型。当我点击某个项目时,它必须更改其UI。我认为有两种选择:

  • 将项目更改为其他视图类型,并通知适配器它已更改,以便它可以为新视图充气以显示新状态。
  • 在单个xml文件中同时包含两个视图。任何时候只能看到一个。当状态改变时,使用setVisibility函数在它们之间切换。

网上有很多关于使用大量视图类型的异构RecyclerViews的文章,但是当项目视图动态变化并且RecyclerView随着时间的推移变得更加异构时,我还看到了一个关于最佳实践的文章。 哪种方法最好在Recycler视图中更改现有视图?有什么权衡?

1 个答案:

答案 0 :(得分:1)

权衡很明显。

  • 单个视图中的两个UI:根据您的观点,这可能:
    • 使视图重叠以进行充气和布局
    • 减慢绑定过程,因为您必须绑定两个UI
    • 最终,延迟滚动过程。

另一方面,您可以快速,精确地控制视图应在特定时间更改外观。将两个UI放在同一个地方允许更精细的动画和一个州与另一个州之间的过渡。

  • 不同的视图类型:我认为您的情况不是首先创建视图类型的原因 - 它们是为了在列表的不同位置同时具有不同的子节点。这个:
    • 可能会减慢转变速度。您必须非常小心如何告诉适配器重新加载对象。你可以在任何地方阅读,你可能想避免重新加载任何对象的notifyDataSetChanged(),而是使用notifyItemChanged()等。这需要一些工作和关注。
    • 不允许(不容易,至少)在一个州和另一个州之间进行视觉转换。

答案是,IMO,只有你能知道。你应该问自己:

  • 这些视图是否复杂?他们有深层次的等级吗?是否会降低性能(例如在绑定部分中)?

  • 是否容易理解哪些视图已更改,并在第二种情况下调用notifyItemChanged(int position)?如果您有很多项目,重新加载整个数据集会对性能产生巨大影响。

  • 您是否需要在一个州和另一个州之间进行一些视觉转换?也许您希望两个UI都适合单个容器(如CardView中的不同信息)?如果这是强制性的,则选项1更好。

  • 你有2个以上的用户界面吗?如果是这样,我会使用视图类型,以免在单个子布局中托管太多视图。

和类似的问题。