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

RecyclerView onClickListener不射击(静态编程语言)

彭衡
2023-03-14

我正在尝试为我的Kotlin RecyclerView实现一个onClickListener。它根本没有开火。代码没有标记为红色或类似的东西。你在NotesActivity中看到的日志和吐司。我们没有被处决。我的recyclerview本身就在工作,但onClickListener根本不会启动。

NotesAdapter。kt

class NotesAdapter(private val dataSet: MutableList<Note>) :
    RecyclerView.Adapter<NotesAdapter.ViewHolder>() {

var clickListener: ClickListener? = null

inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {


    val textViewTitle: TextView
    val textViewBody: TextView

    init {
        // Define click listener for the ViewHolder's View.
        textViewTitle = view.findViewById(R.id.textViewTitle)
        textViewBody = view.findViewById(R.id.textViewBody)

        if (clickListener != null) {
            itemView.setOnClickListener(this)
        }
    }

    override fun onClick(view: View?) {
        if (view != null) {
            clickListener?.onItemClick(view, adapterPosition)
        }
    }
}

fun setOnItemClickListener(clickListener: ClickListener) {
    this.clickListener = clickListener
}

interface ClickListener {
    fun onItemClick(v: View, position: Int)
}

// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
    // Create a new view, which defines the UI of the list item
    val view = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.adapter_note_layout, viewGroup, false)

    return ViewHolder(view)
}

// Replace the contents of a view (invoked by the layout manager)
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

    // Get element from your dataset at this position and replace the
    // contents of the view with that element
    viewHolder.textViewTitle.text = dataSet[position].title
    viewHolder.textViewBody.text = dataSet[position].body
}

override fun getItemCount() = dataSet.size
}

NotesActivity。kt

    adapter = NotesAdapter(mutableListOf())
    recyclerView.adapter = adapter

    adapter.setOnItemClickListener(object : NotesAdapter.ClickListener {
        override fun onItemClick(v: View, position: Int) {

            Log.i("test", "pos: $position")

            Toast.makeText(applicationContext, "pos: $position", Toast.LENGTH_SHORT)
        }
    })

adapter_note_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
app:cardBackgroundColor="@color/colorBackroundBright"
app:cardCornerRadius="15dp">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp"
    android:paddingBottom="8dp">

    <TextView
        android:id="@+id/textViewTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="title"
        android:textColor="@color/colorText"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textViewBody"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="body"
        android:textColor="@color/colorText"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textViewTitle" />

</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

共有1个答案

费明诚
2023-03-14

您只需要在将适配器设置为回收器之前设置侦听器。

只需更改代码即可

adapter = NotesAdapter(mutableListOf())
recyclerView.adapter = adapter

adapter.setOnItemClickListener(object : NotesAdapter.ClickListener {
    override fun onItemClick(v: View, position: Int) {

        Log.i("test", "pos: $position")

        Toast.makeText(applicationContext, "pos: $position", Toast.LENGTH_SHORT)
    }
})

到这个

 adapter = NotesAdapter(mutableListOf())
 adapter.setOnItemClickListener(object : NotesAdapter.ClickListener {
    override fun onItemClick(v: View, position: Int) {

        Log.i("test", "pos: $position")

        Toast.makeText(applicationContext, "pos: $position", Toast.LENGTH_SHORT)
    }
})

recyclerView.adapter = adapter
 类似资料:
  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • > 如何将选择查询映射到类 是否有任何@transactional操作来执行查询?

  • 正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我

  • 我正在Kotlin进行大师/细节流程活动。我有碎片不匹配的问题,因为在一个活动中我需要Android。支持v4.app。Fragment和其他android。应用程序。碎片我实现了自己的细节片段,并继承了Android系统。支持v4.app。用于修复ListActivity中supportFragmnet事务中不匹配的片段 但是,我在DetailActivity中的fragmentManager中