【问题标题】:Android setOnItemClickListener vs setOnClickListenerAndroid setOnItemClickListener 与 setOnClickListener
【发布时间】:2015-02-03 09:17:02
【问题描述】:

据我所知,有两种方法可以处理对不同列表项的点击:

  1. 使用setTag()为Adapter中的列表项设置类型,然后setOnItemClickListener()为列表,getTag()为视图区分类型,如下所示:

listview.setOnItemClickListener(new OnItemClcikListener(){});

  1. 在适配器内部,setOnClickListener()getView() 期间为每个项目单独提供,如下所示:

item.setOnClickListener(new OnClickListener() {});

有什么区别,首选哪一个?

【问题讨论】:

  • 恕我直言,您将需要一个setOnItemClickListener 和很多setOnClickListener... 那么...。您认为最好的是什么?我会说setOnItemClickListener
  • @SabinJose 抱歉,我没有解释清楚。我的意思是行的 OnClickListener 不是列表视图。所以这个问题和你的链接不一样。
  • @SabinJose 实际上它与您的链接答案下方留下的评论 vandus 相同。
  • @PedroOliveira 您的意思是第二种解决方案是为每一行设置clickListener?会不会影响性能?

标签: android listview onclicklistener onitemclicklistener


【解决方案1】:

OnItemClickListenerOnClickListener 相比非常易于管理。 如果您仍然愿意管理OnClickListener,我会告诉您为什么OnItemClickListenerOnClickListener 好得多。

一旦你开始滚动ListView,项目就会开始被重复使用,你最终会创建很多OnClickListener。不用担心,这不是内存泄漏,因为 GC 会出现并收集它们,但您也不应该感到安全,因为 GC pauses your activity 即使它是相当可观的几分之一秒。

那么我会选择OnItemClickListener 除非你为单个列表项计划了不同的东西。

如果您需要为每个项目创建可点击的特定部分,或者希望对给定项目执行多个操作,最好将这些操作收集到一个单独创建的 OnClickListener 中,然后附加到 getView() 中的每个项目。您可以通过将有关单击操作的元数据以及可能使用 setTag() 将位置列表附加到视图本身来区分单击了哪个项目。

【讨论】:

  • 就我而言,我需要为各个项目调用不同的操作。在这种情况下,将 setOnItemClickListener() 与 Tag 一起使用会更好吗?顺便说一句,我会看看源代码。
  • 在调试列表滚动时,我没有看到回收项目的GC,是不是因为我的列表,10个项目,不够长?
  • 10 项是非常小的列表。
【解决方案2】:

我不确定我是否真的明白你的意思,但我会尽力给你答复。

使用 setTag() 为 Adapter 中的列表项设置类型,然后使用 setOnItemClickListener() 为列表和视图的 getTag() 来区分类型,如下所示: listview.setOnItemClickListener(new OnItemClcikListener(){});

您可以使用setTag() 设置Object 之类的标签,这意味着您可以使用它将一些信息放入您的单元格视图中(例如:文本、id 等)。 为了“区分视图的类型”,我建议您使用 `getViewTypeCount()。

在适配器内部,在 getView() 期间为每个项目单独设置 OnClickListener(),如下所示: item.setOnClickListener(new OnClickListener() {});

这实际上更多地取决于你想对你的列表做什么,如果点击的行为与属于你的适配器的信息严格相关,或者例如你的单元格视图中有一个按钮,那么设置一个适配器内的单元格视图的侦听器可能是一个很好的解决方案。 但除了最后一种情况,我会说第一种是最好的解决方案,因为您可以将所需的所有内容放入标签中,并且它使您有机会从主要的ActivityFragment 管理列表的点击。

【讨论】:

    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多