带有多个布局的Android ListView:为什么要为"getItemViewType"而烦恼?



使用不同布局填充 AndroidListView的推荐方法似乎是覆盖

  • getItemViewType(int position)
  • getViewTypeCount().

这在这里的许多问题和答案中都很清楚(例如,这里、这里和这里(。

但是,在查看具体的代码示例/教程时,我真的看不出为什么覆盖这些方法是正确的方法:

  • 基本上,整个过程仍然归结为具有某种条件/switch语句 intgetView(...),该语句根据给定位置的列表项膨胀正确的布局。
  • 这个条件/开关似乎必须手动编写 - 那么,如果您无论如何都要简单地膨胀精心挑选的布局,为什么要费心覆盖上述方法呢?

主要问题是看到的是,使用getItemViewType签名会迫使您首先将布局类型编码为int然后(getView(...)再次将此 int 解码为任何布局类型......这增加了额外的复杂性和出错的可能性。

首先,ListView现在基本上被RecyclerView取代了。 顺便说一下,原因似乎是膨胀代码是根据您在getItemViewType中返回的ViewType为您完成的。我认为这与此处所述观点的回收逻辑有关。框架调用getItemViewType,使用它来确定它是否可以返回回收的视图,或者它是否必须调用getView来膨胀它。

你是对的,我已经使用了具有多种布局的ListView,而没有覆盖getItemViewType(),而只是将条件放在getView()中,

后来我确实过渡到RecyclerView,然后getItemViewType()真的很有意义,因为返回的类型是标记哪个视图被回收,哪个视图不被回收。

对我来说,RecyclerView要好得多,你有没有想过切换到RecyclerView?

即使对于ListView,如果你想在你的适配器中拥有不止一种布局,getItemViewType()也是必要的。

您是正确的,getView()仍然需要修改才能使用正确的视图类型,但正确实现getItemViewType()可确保传递给getView()convertView参数具有正确的结构。如果不覆盖getItemViewType(),则会破坏使ListView性能更高的视图回收。

最新更新