为什么“notifyDatasetChanged()”没有通知所有可见的项目?

时间:2014-08-11 12:29:39

标签: android android-listview notifydatasetchanged

背景

注意:我已经使用listViews多年了,所以我非常熟悉如何使用适配器,ViewHolders等...所以这个问题对我来说没有意义。

这次我陷入了一种非常奇怪的行为,由于某种原因只出现在2台设备上:

  1. LG G2,Android 4.2.2

  2. Xperia J,Android 4.1.2

  3. 问题

    listView有自己的BaseAdapter,在某些事件中我更新其中的项集合(在UI线程上),并调用notifyDatasetChanged()。

    问题是在有问题的设备上,调用此函数仅在listView的某些可见行上调用getView。例如,如果行1,2,3,4,5可见,并且我调用notifyDatasetChanged,并且我将日志放在getView上,我可以看到它超过1,2,4,5(跳过第3行)。

    一些线索

    • 它总是会跳过用户在其中单击的行(每行都有可点击的视图),触发notifyDatasetChanged调用。

    • 其他设备处理listview就好了:2个Nexus 4设备(每个设备有不同的版本),Galaxy S2和Galaxy S4。

    • 如果我调用notifyDataSetChanged一次或两次,这没关系。

    • 即使我使用自己的BaseAdapter,我也没有改变ListView的工作方式。我没有扩展ListView。

    • 对于BaseAdapter类,我已经覆盖了下一个函数:

      • getViewTypeCount -returns 2
      • getItemViewType - 返回0或1,具体取决于行的类型
      • getCount将
      • 的getItem
      • getItemId - 我不需要它,所以我总是返回0(它不会帮助它返回位置)。
      • getView
      • areAllItemsEnabled和isEnabled - 始终返回false,因为所有行都有内置视图,只有他们需要处理点击。

      我没有覆盖任何其他方法。当然我创建了辅助函数,但那就是它。

    问题

    为什么会发生?

    为什么它只出现在某些设备上?

    我该如何解决这个问题?

    它可能是某些roms的错误吗?

    如果是这样,有没有一个很好的解决方法,或者我真的应该在有问题的行上调用getView(它工作得很好BTW,但我这样做很奇怪)?

0 个答案:

没有答案