Android setOnItemClickListener与setOnClickListener的区别

6
据我所知,处理不同列表项点击的方法有两种:
  1. 在适配器中使用 setTag() 为列表项设置类型,然后为列表使用 setOnItemClickListener(),并使用视图的 getTag() 区分类型,例如:

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

  1. 在适配器内部,在 getView() 中为每个列表项单独使用 setOnClickListener(),例如:

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

这两种方法有何区别?哪一种更好?


1
我认为你需要一个 setOnItemClickListener 和很多 setOnClickListener……那么,你认为哪个最好?我会说 setOnItemClickListener - Pedro Oliveira
1
请查看此答案:https://dev59.com/n2XWa4cB1Zd3GeqPIgC_ - Sabin Jose
1
@SabinJose 抱歉,我没有解释清楚。我的意思是行的OnClickListener而不是ListView的。所以这个问题和你的链接不一样。 - GilbertLee
@SabinJose 实际上这与vandus在您链接的答案下留下的评论相同。 - GilbertLee
@PedroOliveira 你的意思是第二种解决方案是为每一行设置clickListener吗?这会影响性能吗? - GilbertLee
请在此处查看答案:https://dev59.com/hXDYa4cB1Zd3GeqPEMmz....。你会得到很好的解释。 - Archana S M
2个回答

3
OnItemClickListenerOnClickListener容易管理得多。 如果您仍然想管理OnClickListener,我会告诉您为什么OnItemClickListenerOnClickListener好得多。

一旦你开始滚动ListView,列表项将开始重复使用,你会不断创建很多OnClickListener。不用担心,这不是内存泄漏,因为垃圾回收器(GC)会介入并回收它们,但你也不应该感到安全,因为GC暂停了您的活动,即使只有一小部分秒钟也要考虑。

所以,除非您为单个列表项计划了不同的处理,否则最好使用OnItemClickListener

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


在我的情况下,我需要为每个项目调用不同的操作。在这种情况下,仍然最好使用带有标签的setOnItemClickListener()吗?顺便说一句,我会查看源代码。 - GilbertLee
当我调试列表滚动时,我没有看到项目回收的GC,这是因为我的列表只有10个项目不够长吗? - GilbertLee
10个项目是非常小的清单。 - Praveena

0

我不太确定我是否真正理解你的意思,但我会尽力给你一个回复。

在Adapter中使用setTag()为列表项设置类型,然后为列表设置setOnItemClickListener(),并使用view的getTag()来区分类型,就像这样: listview.setOnItemClickListener(new OnItemClcikListener(){});

你可以使用setTag()来设置一个像标签一样的Object,这意味着你可以用它来放置一些信息到你的单元格视图中(如:文本、ID等)。 为了"区分视图的类型",我建议你使用`getViewTypeCount()`。

在适配器中,在getView()期间为每个项目单独设置setOnClickListener(),就像这样: item.setOnClickListener(new OnClickListener() {});

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接