如何解决Android - onClickListener 不适用于 CardView 中的 ImageButton 真正的问题
我在 StackOverflow 上搜索了类似的问题,并按照那里描述的说明进行了操作,但我仍然无法为我的图像按钮触发 onClickListener。有人可以帮我吗?
我详细解释了我的问题。
这是我的 CardView xml:
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:textAppearance="?attr/textAppearanceHeadline6" />
<TextView
android:id="@+id/item_description"
android:layout_below="@id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?attr/textAppearanceBody1"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
<com.google.android.material.button.MaterialButton
style="?attr/borderlessButtonStyle"
android:id="@+id/workout_start_action"
android:layout_below="@id/item_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start_workout" />
<ImageButton
android:id="@+id/workout_delete_imgButton"
android:layout_below="@id/item_description"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_delete"
android:padding="8dp"
android:contentDescription="FavButtonDesc" />
</RelativeLayout>
</com.google.android.material.card.MaterialCardView>
这是我的适配器:
package com.example.workouttimer.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.example.workouttimer.R
import com.example.workouttimer.model.Workout
class WorkoutItemAdapter(private val context: Context,private val dataset: List<Workout>
) : RecyclerView.Adapter<WorkoutItemAdapter.WorkoutItemViewHolder>() {
class WorkoutItemViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
val textView = view.findViewById<TextView>(R.id.item_title)
val descriptionTextView = view.findViewById<TextView>(R.id.item_description)
val imgDeleteButton = view.findViewById<ImageView>(R.id.workout_delete_imgButton)
}
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): WorkoutItemViewHolder {
// create a new view
val adapterLayout = LayoutInflater.from(parent.context)
.inflate(R.layout.workout_list_item,parent,false)
return WorkoutItemViewHolder(adapterLayout)
}
override fun getItemCount(): Int {
return dataset.size
}
override fun onBindViewHolder(holder: WorkoutItemViewHolder,position: Int) {
val item = dataset[position]
holder.textView.text = item.workoutName
holder.descriptionTextView.text = item.workoutDescription
holder.imgDeleteButton.setonClickListener(View.OnClickListener {
/*fun onClick(v: View) {
Toast.makeText(v.context,"BORRADO!!!",Toast.LENGTH_LONG)
}*/
fun onClick(position: Int) {
Toast.makeText(this.context,Toast.LENGTH_LONG)
}
})
}
}
我做错了什么?提前致谢。
解决方法
你确定它没有开火吗?我这么问是因为你忘记在吐司上调用 show()
。因此,在您点击时尝试记录事件,或者像这样在您的吐司上调用 show()
:
Toast.makeText(context,"BORRADO!!!",Toast.LENGTH_LONG).show()
真正的问题
所以下面的代码是SAM conversion
的一个例子// What you did
View.OnClickListener { // This is where the SAM conversion happens
fun onClick(position: Int) { // This is a local function defined inside your lambda
Toast.makeText(this.context,Toast.LENGTH_LONG)
}
}
}
// What you should've done
View.OnClickListener { // This is where the SAM conversion happens
Toast.makeText(this.context,Toast.LENGTH_LONG).show()
}
因为 View.OnClickListener
只有一个抽象方法,通过使用 SAM 转换,您不必指定要覆盖的方法
编辑:在 Kotlin 中,您不能在没有 override
关键字的情况下重写方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。