2014-10-05 132 views
2

我一直在试图理解BaseAdapter.hasStableIds()是如何工作的。让BaseAdapter.hasStableIds()返回真正解决什么?

从我读过的内容中,返回true可以帮助适配器确定视图是否必须重新创建或保持不变。我猜测适配器以某种方式将位置映射到一个id,并且如果映射保持不变,那么调用notifyDataSetChanged()时,适配器不执行任何操作。

但是,如果数据已更改,而id(和位置)保持不变,这不会是一个问题吗?如果这确实是一个问题,那么到底什么时候才能真正恢复真正的帮助?

回答

3

hasStableIds() == true意味着项目ID不会更改基础数据项目,也不会更改该项目的数据。例如。相同的联系人具有相同的ID,无论它出现在列表中的哪个位置,但其名称可能随时间而改变 - 用户可以编辑它,添加昵称等等。可以想象在每个项目没有稳定ID的情况下显示数据(也许数据不是你的,你无法访问适合从getItemId()返回的唯一ID,例如与long返回类型不兼容)。

在浏览为AdapterViewAbsListView的源代码,在我看来,当你设置一个ListView/GridView的选择模式,这是最有用,因为这样的观点可以做检查物品ID的一些更有效的管理和它们是可视状态,包括跨数据集更改,其中那些已检查的项目可能已移至新位置(但它们具有相同的ID)。

+0

谢谢你的解释。你可以看看这个:[Android - StableIDs是什么意思?](http://stackoverflow.com/a/18217552/3954358)?那么给定的答案是错误的? – Athena 2014-10-05 20:18:11

+0

说实话,我不是100%确定的。特别是'ListView'是Android中最复杂的视图类之一,它背后的代码将需要相当长的时间来包装头部。我认为在回收意见方面可能会有一些优化,但对我来说这似乎很奇怪; ListView应该为每一行调用'getView()',然后在'notifyDataSetChanged'之后显示每一行,以便填充每一行中的数据...... – Karakuri 2014-10-06 05:44:57

+0

** ListView应该为每一行调用getView()在notifyDataSetChanged后显示反正**你是怎么想的? – 2017-08-02 18:03:15