使用不同布局填充 AndroidListView
的推荐方法似乎是覆盖
getItemViewType(int position)
和getViewTypeCount()
.
这在这里的许多问题和答案中都很清楚(例如,这里、这里和这里(。
但是,在查看具体的代码示例/教程时,我真的看不出为什么覆盖这些方法是正确的方法:
- 基本上,整个过程仍然归结为具有某种条件/switch语句 int
getView(...)
,该语句根据给定位置的列表项膨胀正确的布局。 - 这个条件/开关似乎必须手动编写 - 那么,如果您无论如何都要简单地膨胀精心挑选的布局,为什么要费心覆盖上述方法呢?
主要问题是看到的是,使用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
性能更高的视图回收。