【问题标题】:Android ListView w/ multiple Layouts: why bother with `getItemViewType` at all?带有多个布局的Android ListView:为什么要使用`getItemViewType`?
【发布时间】:2017-08-07 13:38:32
【问题描述】:

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

  • getItemViewType(int position), 和
  • getViewTypeCount()

这里的许多问题和答案都清楚地表明了这一点(例如hereherehere)。

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

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

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

【问题讨论】:

    标签: android android-layout listview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      后来我确实转换到了 RecyclerView,然后getItemViewType() 真的很有意义,因为返回的类型标志着哪个视图被回收而哪个视图没有被回收。

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

      【讨论】:

        【解决方案3】:

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

        你说得对,getView() 仍然需要修改才能使用正确的视图类型,但正确实现 getItemViewType() 是确保传递给 getView()convertView 参数是正确的结构体。如果您不覆盖 getItemViewType(),那么您将破坏使 ListView 高效的视图回收。

        【讨论】:

          猜你喜欢
          • 2013-12-25
          • 1970-01-01
          • 2015-06-10
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          • 1970-01-01
          相关资源
          最近更新 更多