具有多个布局的Android ListView:为什么要使用`getItemViewType`呢?

时间:2017-08-07 13:38:32

标签: android android-layout listview

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

  • getItemViewType(int position)
  • getViewTypeCount()

此处的许多问题和答案都明确了这一点(例如hereherehere)。

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

  • 基本上整个过程仍归结为某种条件/开关语句int getView(...),它会根据给定位置的列表项膨胀正确的布局。
  • 这个条件/开关必须手写手写 - 所以为什么要干扰上面的方法,如果你还要简单地夸大手工挑选的布局呢? / LI>

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你是对的,我使用了几个布局的ListView而没有覆盖getItemViewType(),只是将条件放在getView()

后来我转换到了RecyclerView,然后getItemViewType()非常有意义,因为返回的类型标记了哪些视图被回收,哪一个没有。

对我来说,RecyclerView要好得多,您是否考虑过切换到RecyclerView?

答案 2 :(得分:0)

即使对于ListView,如果您希望在适配器中使用多种布局,也需要getItemViewType()

您是正确的,getView()仍然需要修改才能使用正确的视图类型,但正确实现getItemViewType()可以确保convertView参数传递给{ {1}}是正确的结构。如果您没有覆盖getView(),那么您将失去使getItemViewType()效果良好的视图回收。