在适配器和片段中设置 onClickListener 的区别

Difference between setting onClickListener in adapter and in fragment

在我的代码中,我有 fragment 和 gridview。我也有这个 Gridview 的 ArrayAdapter。现在我需要在单击时更改网格单元格的背景颜色。我通过设置 onClickListener 来做到这一点。

问题是在适配器和片段中为 GridView 单元格设置 onClickLister 有什么区别?

我将尝试稍微澄清一下您问题中涉及的不同 android 实体。

一个GridView是一个View

  • 您可以将点击侦听器分配给视图,以便它们对用户点击做出反应。任何视图都有一个通用的点击监听器 (View.setOnClickListener),每当用户点击视图的任何部分时都会调用该监听器

  • 复杂的视图可以有几个其他更专业的点击监听器,例如,menu-like 视图(ListViews、GridViews 等)也会有一个 setOnItemClickListener / setOnItemLongClickListener 每当用户点击一个项目(相对于整个视图)时都会被调用

一个Adapter只是一个class,其目的是用数据构建视图到data-consuming视图。例如,您的 GridViewAdapter: 它将为每一行调用一次,并将构造每个行视图(在 getView 方法中)。每个行视图(可能)将是一个 ViewGroupFrameLayout/RelativeLayout...),其中包含一些其他视图(即图标 ImageView、名称 TextView, 地址...)

所以适配器本身不接受点击监听器。但是适配器创建的视图可以!例如,假设您的 GridView 是一个 Phone 列表:

  • 您的 GridView 有一个 ItemClickListener 来响应所选的 phone 列表条目并显示有关联系人的信息

  • 您的 GridView 适配器为每一行构建视图。假设您的 'contact' 行有 3 个视图:标题、图标和删除联系人的按钮

  • 在您的适配器中,您将向 "delete contact" 按钮 View 分配一个 onClickListener。请注意,您始终将 onClickListeners 分配给视图,而不是适配器本身 ("you can't click an adapter!")

  • 关于片段,将它们视为 "sub-activities"。片段包含具有多个视图的根布局。同样,它将在您分配点击监听器的那些视图中,而不是片段本身。