当前位置: 首页 > 知识库问答 >
问题:

如何使用Kotlin的自定义适配器为列表视图设置nItemClickListener

谷梁楚青
2023-03-14

我在android应用程序上使用自定义适配器查看列表。我不知道如何设置项目单击的侦听器。我的应用程序使用Kotlin。

这是我的适配器布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <CheckBox
        android:id="@+id/cbx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="" />
    <TextView
        android:id="@+id/txtNameNote"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_toRightOf="@+id/cbx"
        />
    <TextView
        android:id="@+id/txtPercent"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="TextView"
        android:layout_toRightOf="@+id/cbx"
        android:layout_below="@+id/txtNameNote"
        />
    </RelativeLayout>
</LinearLayout>
class CustomAdapter(internal var context: Context, resource: Int, internal var listNote: ArrayList<Note>) : ArrayAdapter<Note>(context, resource, listNote) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var convertView = convertView
        // TODO Auto-generated method stub
        val inflater = (context as Activity).layoutInflater
        convertView = inflater.inflate(R.layout.rowlistitem, parent, false)
        val name = convertView!!.findViewById<View>(R.id.txtNameNote) as TextView
        val percent = convertView.findViewById<View>(R.id.txtPercent) as TextView
        val cb = convertView.findViewById<View>(R.id.cbx) as CheckBox
        name.text = listNote[position].name
        percent.text = "Percent: " + listNote[position].percent + "%"

        if (listNote[position].status == NoteStatus.Active.value)
            cb.isChecked = false
         else{
            name.paintFlags = (name.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG)
            cb.isChecked = true
        }
       }
      }
        return convertView
    }
}

有人可以帮助我吗?

共有1个答案

须景辉
2023-03-14

Kotlin中正确的方法是创建回调。然后在适配器中创建一个click监听器,并将结果转发给回调函数。

class CustomAdapter(
      internal var context: Context, 
      resource: Int, 
      internal var listNote: ArrayList<Note>,
      val callback: (Note) -> Unit) : ArrayAdapter<Note>(context, resource, listNote) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        // .. do your bindings whatever 
        convertView.yourRootLayoutElement.setOnClickListener{ 
           if (callback != null) callback(listNote[position])
        }
        return convertView
    }
}

在您创建适配器的视图中

CustomAdapter(...., { info { "Clicked $it" } })

因为不用ListView,所以没有测试过。我推荐你使用RecyclerView。ListView已被弃用,出于几个原因不推荐使用。在这里看一些原因。

编辑:绝对没有理由使用ListView而不是RecyclerView。即使它有效,您也不应该使用它。了解 RecyclerView,因为 ListView 不应再使用。

 类似资料:
  • 我正在尝试为我的列表视图制作一个自定义适配器,但我在同一行上不断得到一个 RessourceNotFoundException。 首先,这是我的适配器类代码: 这是视图的xml,包含listview: 以及带有上述列表视图的项目布局的xml文件: 这是在我的活动中设置适配器的代码(扩展活动) 我遇到的错误是: 12661-12661/com.mobileplatformexam E/Android

  • 问题内容: 嗨,您想创建一个自定义光标适配器,以便显示2行文本的图像。我在理解自定义光标适配器时遇到了一些麻烦,但是我不明白如何添加要从数据库路径填充的imageview。 问题答案: 将, 实际上,我已经实现了与您正在寻找的东西非常相似的东西。这是我的实现。 XML只是万一… 根据特定条件,这将在文本的两行显示最多2幅图像。 希望这可以为您的工作打下基础! 祝好运 :]

  • 我有一个ListView和一个自定义适配器。问题是我看不到listview和数据,只看到一个白色页面。 在片段中我有: 在CustomAdapter中,我有: 我错在哪里? 更新: 谢谢,如果我想在ImageButton上设置onClickListener,我该怎么做?。。我尝试: 但问题是,当我单击例如第一个项目viewHolder时。mNomeView。getText()。toString()

  • 我正在寻找在Android中使用列表适配器和Recyview适配器的区别。关于性能的任何不同,使用它们的利弊。

  • 我正在尝试制作的音乐播放器中使用Volley。 下面是我如何定义音乐播放器中的歌曲。我有一个带有一些属性的“歌曲对象” 我使用albumArtURI用图像填充各种列表和网格视图。 要获取专辑ArtURI,我对其进行查询。如果URI不存在,我必须从Internet上拉取一个图像URL。 所以我设置了截取,从iTunes中提取JSON对象,解析对象,并获取它们的图像URL。 例如,这里是iTunesJ

  • 我使用一个API,它以数组的形式返回数据,比如这个JSON字符串(我们称之为“任务”) 我想将这个响应解析为一个列表。所以我已经用生成的适配器创建了相应的数据类 我的改装服务是这样的 但我想使用容器类型,例如: 作为网络响应结果。这可能不创建自定义adpter或者我将需要创建一个自定义适配器并将其传递给moshi构建器吗?