【发布时间】:2011-10-30 11:14:31
【问题描述】:
我有一个列表视图,其中每个列表项可以包含 1 个或多个可点击图像。单击它们会启动一个显示图像全屏版本的活动。
以下代码(略微简化)在我的GetView() 实现中为每个ListItem 中的每个图像设置OnClickListeners。这非常有效。
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 开始表现得有些古怪。
具体来说,现在当点击给定图像时,OnClickListener 可能会立即触发或根本不触发。在它不立即触发的情况下,它可能会在开始滚动时立即触发。如果这不会触发OnClickListener 运行,单击返回(退出活动)可能会触发它。如果这没有触发它,则通过按 BACK 关闭所有活动)然后重新进入应用程序将触发所有排队的OnClickListeners。在一种情况下,我在各种图像上单击了 25 次,但没有任何结果。然后我关闭了所有活动,然后再次单击应用程序图标,打开了所有 25 个图像预览。
知道是什么原因造成的吗?令我感兴趣的是OnClickListeners 显然设置正确,因为它们确实会在某个时间点打开照片查看器活动。永远不会打开错误的图像,也永远不会出现它们从不开火的情况。问题是它们可能会立即发射,也可能会在很久以后发射。
不建议像我一样保存每个列表项的视图并根据getView() 中的位置返回它们吗?非常感谢任何帮助。
【问题讨论】:
-
您应该发布整个
getView()方法,否则将很难诊断为什么会发生这种特定行为。
标签: android listview onclick listener