我一直在使用 listview,但突然间我体验到了它的一些随机行为。 当我在 ListView 上调用 invalidateViews() 时,在某些情况下它会重新膨胀每一行的 View ,而在某些情况下它不会。这是完全随机的。你能告诉我它是如何工作的吗? 理想情况下,它应该只刷新 View (行)内的数据,而不是再次膨胀它们。
谢谢
最佳答案
在 ListView 上调用 invalidateViews() 不应重新膨胀 ListView 项目 View 。强制 ListView 重新扩充其项目 View (即清除回收的 View )的唯一方法是重置 ListView 适配器(我必须深入研究源代码才能发现这一点)。
如果您查看 invalidateViews() 方法实现(AbsListView.java 中的源代码),您将看到以下内容 (Android API 16):
/**
* Causes all the views to be rebuilt and redrawn.
*/
public void invalidateViews() {
mDataChanged = true;
rememberSyncState();
requestLayout();
invalidate();
}
AdapterView.java中实现的方法rememberSyncState()保存了ListView中被选中项的位置(如果有的话),可以查看。
requestLayout() 方法负责测量、布局和绘图(据我所知),所以这里也没有任何内容。
最后 invalidate() 用于强制 ListView 绘制(使用新的测量值,...)
所以调用invalidateViews()不应该强制 ListView 重新膨胀它的 View 。 您能否在某处重新设置适配器,以便它重新膨胀所有 View ?
关于android - 在 Listview 上调用 invalidateViews() 是否会重新膨胀行 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18437445/