【问题标题】:ListView, BaseAdapter, getViewTypeCount() - How to force adapter to check again getViewTypeCount()?ListView、BaseAdapter、getViewTypeCount() - 如何强制适配器再次检查 getViewTypeCount()?
【发布时间】:2013-02-26 20:52:58
【问题描述】:

我将自己的BaseAdapter (standingsListAdapter) 用于ListView (standingsLV)。 当我设置适配器时:

standingsLV.setAdapter(standingsListAdapter);

getViewTypeCount() 被调用。 但后来,当我在适配器中设置新数据时:

standingsListAdapter.setData(data);

在哪里setData(data)设置新数据后调用notifyDataSetChanged()

public void setData(StandingsModelWrapper data) {
    groupsData.clear();
    if (data != null) {
        groupsData.addAll(data.getModel());
    }
    notifyDataSetChanged();
}

方法 getViewTypeCount() 不再被调用。为什么? 如何强制适配器再次检查getViewTypeCount()?


我为什么需要这个?

  • 我在列表的每一行都显示表格。表格有不同的长度(行数)。
  • 我想在适配器中设置新数据,以便表的长度可以改变

这就是为什么每次新数据到达列表适配器时都应该重新计算我的视图类型的数量。

【问题讨论】:

  • 我不确定这是否可行,但您可以尝试使用相同的适配器再次调用 setAdapter。
  • setAdapter 无论如何都会调用notifyDataSetChange(),也会做一些额外的工作......我建议你只使用那种方法,就像@pietmau 说的那样。

标签: android listview android-listview adapter baseadapter


【解决方案1】:

我认为这是不可能的。

Get getViewTypeCount() 实现是适配器定义的一部分;无论适配器在任何给定时刻的实际数据是什么,它都定义了它可以保存的所有可能的类型数据。

getViewTypeCount 被框架调用以正确回收在适配器持有的不同类型的数据之间可能非常不同的列表项视图。当您更改适配器中的数据时,仍然会根据getViewTypeCount 的现有定义/实现来回收视图。

如果您希望再次调用getViewTypeCount,请创建一个全新的适配器并将这个新适配器设置为您的列表视图的适配器。

【讨论】:

  • 你明白了,伙计。 (剑桥街道)
  • 最简单的解决方案总是最好的 :) 感谢 Yami 和 Streets Of Boston。我还检查了来源,并且 getViewTypeCount() 在 ListView 类的 setAdapter(ListAdapter adapter) 方法中只调用了一次。所以重新设置适配器是唯一的解决方案。
  • 注意再次设置adapter会导致ListView失去当前滚动位置等,效率也不高。如果您知道在任何给定时间您可以在适配器数据中预期哪些类型的项目,您应该编写您的 getViewTypeCount 来执行此操作,让它预测它可以获得的所有类型的数据。
【解决方案2】:

我会尝试:

standingsListAdapter.notifyDataSetChanged();

【讨论】:

  • 如果你再次阅读我的代码,你会看到我已经为我的适配器调用了 notifyDataSetChanged。而且它不会调用 getViewTypeCount()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
相关资源
最近更新 更多