Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GetView方法和convertView错误概念?_Android_Android Layout - Fatal编程技术网

Android GetView方法和convertView错误概念?

Android GetView方法和convertView错误概念?,android,android-layout,Android,Android Layout,我已经阅读了好几次关于GetView DataAdapter类的android文档。据我所知,如果我有一个同质列表,其中每个项目都只是一个文本视图,所有项目都在屏幕内(不可能滚动),那么就不会有任何视图循环,因此我应该会收到4个对GetView的调用,convertView为空。嗯,这不是发生在我身上的事。第一次convertView为null,但其他3个已创建项的值相同。列表填充正确,但我想了解为什么会发生这种情况。如果有人能帮助我,我将非常感激 我相信Android总是试图回收视图,因为这将

我已经阅读了好几次关于GetView DataAdapter类的android文档。据我所知,如果我有一个同质列表,其中每个项目都只是一个文本视图,所有项目都在屏幕内(不可能滚动),那么就不会有任何视图循环,因此我应该会收到4个对GetView的调用,convertView为空。嗯,这不是发生在我身上的事。第一次convertView为null,但其他3个已创建项的值相同。列表填充正确,但我想了解为什么会发生这种情况。如果有人能帮助我,我将非常感激

我相信Android总是试图回收视图,因为这将使用户数量增加得最快。所有视图是否都适合列表的可见视口并不重要。视图的膨胀/创建非常昂贵,这就是安卓希望尽可能多地回收的原因

可以保证传递到GetView的视图将是相同的视图类型(在数据适配器中定义)或null。如果为null,则需要为该视图类型创建新视图,否则应尝试重用传入的视图。对于文本视图的同质列表,非常简单:

if (convertView == null)
{
    TextView tv = new TextView();
    ....
    tv.setText("First Item");
}
else
{
    TextView tv = (TextView) convertView;
    ...
    tv.setText("Recycled Item");
}

为简单起见,您总是可以返回一个新视图,而不是使用convertView,但性能并没有那么好。

确切地说,这是基于从getItemViewType()返回的值。那么,为什么列表中会显示4个不同的文本呢?如果它是allways recycling first创建的,那么我是否会改变原始视图的文本,从而拥有一个包含4个项目的列表,并引用同一视图?我有点搞砸了。Android引擎盖下的视图引用数量并不等于列表中的项目数量。一旦您将视图引用返回到Android,您就不应该再考虑它了。Android将负责视图引用的生命周期。它可能只是将视图渲染为位图,然后因为它不需要视图对象,所以会将其返回以供循环使用。或者它可以快速复制它持有一段时间的视图。如果你对Android源代码的工作原理感到好奇的话,可以看看它。我打赌这很有趣。@Notbad您仍然可以向它们添加
onClickListener()
。最简单的方法是使用
ListView.setOnItemClickListener()
,但也可以在每个TextView上设置一个侦听器,然后再将其返回到getView()方法中。@不错,Tim是正确的。这应该和回收一起工作。如果您在这个问题中发布您的代码,我们可以查看它,也许可以诊断出问题所在。我已经尝试[在这里][1]解释listview和回收机制是如何工作的[1]: