android - 在 Listview 上调用 invalidateViews() 是否会重新膨胀行 View ?

标签 android android-listview

我一直在使用 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/

相关文章:

android - 更改通知的默认操作

java - Android Studio,如何从Sqlite 数据库中检索数据并将其显示到textview 中?

android - 如何在使用数据加载 ListView 之前在具有 ListView 的 Activity 中显示进度条(圆圈)

Android同时为所有 ListView 项目设置动画

Android viewflipper 和画廊

java - Android 应用程序崩溃 : java. lang.IllegalArgumentException:RequestCode 只能使用低 16 位

java - 匹配正则表达式但仅替换第一部分 - Java

android: listview 使用自定义图片

java - 如何确定 Android 中 ListView 的单元格布局大小?

android - 为什么我的带有 CheckBox id 的 ListView 变得困惑了?