我有一个列表视图,其中每个列表项可以包含一个或多个可点击图像。单击它们会启动一个显示图像全屏版本的活动。
以下代码(略微简化)为OnClickListeners
实施中的GetView()
设置每个ListItem
中的每个图片。这非常有效。
ImageView imageView = (ImageView)convertView.findViewById(R.id.image_res);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ActivityLauncher.startPhotoViewerActivity(mContext, item);
}
});
但是,为了提高性能,我决定在第一次构建它之后将每个视图存储在内存中。我这样做而不是使用convertView
,因为有4-5种不同类型的视图,它们有时在代码中动态构造,因此难以重复使用。
一旦我开始将视图存储在内存中,然后根据位置在后续调用getView()
期间返回已构建的视图,性能会显着提高,但OnClickListeners
开始表现得很时髦。< / p>
具体而言,现在当点击给定图像时,它的OnClickListener
可能会立即触发或根本不触发。在不立即开火的情况下,一旦开始滚动,它可能会立即开火。如果这不会触发OnClickListener
运行,则单击返回(退出活动)可能会触发它。如果这不触发它,则按BACK)关闭所有活动,然后重新进入应用程序将触发所有排队的OnClickListeners
。在一个案例中,我在各种图像上点击了25次而没有结果。然后我关闭了所有活动,然后再次单击了应用程序图标,打开了所有25个图像预览。
知道导致这种情况的原因是什么?我感兴趣的是OnClickListeners
显然设置正确,因为他们确实在某个时间点打开了照片查看器活动。永远不会打开错误的图像,并且永远不会发生任何情况。问题是它们可能会立即或稍后发射。
是否不建议为每个列表项保存视图,并根据getView()
内的位置返回它们,就像我在做什么一样?非常感谢任何帮助。
答案 0 :(得分:3)
观看Google I / O上提供的ListViews演讲。在13:45,他们特别警告不要缓存视图并返回它们。如果这样做,它可能导致奇怪的行为,这正是我所经历的。鉴于此,这个问题没有实际意义。
http://www.youtube.com/watch?v=wDBM6wVEO70
希望这有助于将来避免陷入同样的陷阱。不推荐缓存视图!!!