Android setOnItemClickListener 与 setOnClickListener

Android setOnItemClickListener vs setOnClickListener

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

  1. 在Adapter中使用setTag()为列表项设置类型,然后为列表setOnItemClickListener()和视图的getTag()来区分类型,像这样:

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

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

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

有什么区别,首选哪个?

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

Use setTag() to set types for items of list in Adapter, then setOnItemClickListener() for the list and getTag() of the view to differentiate the type, like this: listview.setOnItemClickListener(new OnItemClcikListener(){});

您可以使用 setTag() 来设置一个 Object 就像一个标签,这意味着您可以使用它来将一些信息放入您的单元格视图(例如:文本、id 等等)。 对于 "differentiate the type" 你的观点,我建议你使用 `getViewTypeCount().

inside the adapter, setOnClickListener() individually for each item during getView(), like this: item.setOnClickListener(new OnClickListener() {});

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

OnClickListener 相比,

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

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

我也会选择 OnItemClickListener ,除非您为单个列表项计划了不同的内容。

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