我仍然不明白这段代码。
他们说当ListView没有被使用时,列表视图将被设置为不可见以节省内存。
// Check if an existing view is being reused, otherwise inflate the view
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
}
首先,我不知道膨胀方法的用途。另一方面,当listItemView不可见或未被使用时,看起来上面的代码看起来像, 使ListItemView显示或可见。如果Android应用程序执行此操作,它将显示所有未使用的列表项视图并耗尽所有内存。这与保存记忆的想法相矛盾。
答案 0 :(得分:2)
上帝,我现在对Android有点生疏,我现在忙于JavaEE和Oracle。好吧,这没什么。
如果我的记忆没有让我失望,那么inflate
方法应该解析保存为layout_list_item
的UI布局,并从中创建一个实际可以使用的View
对象
关于你所听到的......我想你可能会误解。正如你所说,使容器不可见,绝对不会保存任何内存。 Android可能做的是:它创建的容器数量与在屏幕上同时显示的容器一样多,然后在滚动出来时交换它们的内容,以便将它们放在下面并重复使用。例如,只有8到10个容器用于显示ListView
内的100个或更多实际项目。你在内存中有大约110个对象而不是200个,我可以看到一些RAM被保存在那里。
这是一个众所周知的良好做法,我非常确定Android并不是唯一利用它的平台。顺便提一句,Angular Material也是这样做的。
答案 1 :(得分:0)
首先,我不知道膨胀方法是什么。
inflate()方法读取XML布局文件,并为UI元素创建Java对象以显示在屏幕上。
另一方面,它看起来像代码......
我不明白你问题的这一部分。这里发生了两件事
假设您有一个包含100个项目的列表视图,但只有足够的屏幕空间一次显示10个。 Android只会创建10个可见的视图,这些视图通过不创建所有100个视图来节省内存。
当用户向下滚动时,Android会重新使用从屏幕底部显示的视图从屏幕顶部消失的视图。换句话说,Android在滚动到屏幕上时不会创建新的视图对象。这减少了垃圾收集器必须执行的工作量,这需要CPU周期。 convertView
是重用的视图。如果此引用变量为null,则没有可重用的视图,因此e必须通过膨胀XML布局资源来创建新的视图。
您提供的代码可能更容易以不同的形式理解:
View listItemView;
if (convertView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
} else {
listItemView = convertView;
}
现在我们很清楚我们正在检查给定的convertView
是否为空。如果是这样,那么我们必须夸大新视图。如果没有,那么我们可以重用现有的视图。您问题中的原始代码是等效的。