OnClickListeners没有持续触发

时间:2011-10-30 11:14:32

标签: android listview onclick listener

我有一个列表视图,其中每个列表项可以包含一个或多个可点击图像。单击它们会启动一个显示图像全屏版本的活动。

以下代码(略微简化)为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()内的位置返回它们,就像我在做什么一样?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

观看Google I / O上提供的ListViews演讲。在13:45,他们特别警告不要缓存视图并返回它们。如果这样做,它可能导致奇怪的行为,这正是我所经历的。鉴于此,这个问题没有实际意义。

http://www.youtube.com/watch?v=wDBM6wVEO70

希望这有助于将来避免陷入同样的​​陷阱。不推荐缓存视图!!!