【问题标题】:OnClickListeners not consistently firingOnClickListeners 没有持续触发
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2011-02-07
    • 2023-03-10
    相关资源
    最近更新 更多