1

很久以来我一直在使用 listview,但突然间我体验到了它的一些随机行为。当我在列表视图上调用 invalidateViews() 时,在某些情况下它会重新膨胀每一行的视图,而在某些情况下则不会。这是完全随机的。你能告诉我它是如何工作的吗?理想情况下,它应该只刷新视图(行)内的数据,而不是再次膨胀它们。

谢谢

4

3 回答 3

2

ListView上调用invalidateViews() 不应重新膨胀 ListView 项目视图。强制 ListView 重新膨胀其项目视图的唯一方法,即清除回收的视图,是重置 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()用于强制列表视图绘制(使用新的测量值,...)

因此调用invalidateViews() 不应强制列表视图重新膨胀其视图。您可以在某处重新设置适配器,以便重新膨胀所有视图吗?

于 2013-08-26T06:58:08.740 回答
0

Actually, listview.invalidateViews() causes all the views to be rebuilt and redrawn. You can come to know this when you look on the description gets displayed in eclipse when you try to select invalidateViews().

于 2013-08-26T06:12:26.507 回答
0

adapter's getView() method has parameter convertView which is null first time when you populate a listview, later when you scroll/invalidate your listview convertView is not null so you can use it and dont need to inflate a new row

于 2013-08-26T06:14:36.630 回答