[英]How to implement onClick listener on nested recyclerview
我正在嘗試在嵌套的回收器視圖上實現點擊偵聽器,以便在單擊子回收器視圖上的項目時執行操作。 我可以為父 recyclerview 執行此操作,但似乎無法為子 recyclerview 項目執行此操作。 非常感謝您為此付出的時間和幫助。
下面是我的 MainActivity.kt
package com.example.nestedrecyclerview
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnClickListener
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
class ParentAdapter(private val parentList: List<ParentItem>,
private val listener : OnItemClickListener ) :
RecyclerView.Adapter<ParentAdapter.ParentViewHolder>() {
inner class ParentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
val logoIv: ImageView = itemView.findViewById(R.id.parentLogoIv)
val titleTv: TextView = itemView.findViewById(R.id.parentTitleTv)
val childRecyclerView: RecyclerView = itemView.findViewById(R.id.ch)
init {
itemView.setOnClickListener(this)
}
override fun onClick(p0: View?) {
val position : Int = adapterPosition
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position)
}
}
}
interface OnItemClickListener{
fun onItemClick(position: Int)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ParentViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.parent_item, parent, false)
return ParentViewHolder(view)
}
override fun onBindViewHolder(holder: ParentViewHolder, position: Int) {
val parentItem = parentList[position]
holder.logoIv.setImageResource(parentItem.logo)
holder.titleTv.text = parentItem.title
holder.childRecyclerView.setHasFixedSize(true)
holder.childRecyclerView.layoutManager = GridLayoutManager(holder.itemView.context, 3)
val adapter = ChildAdapter(parentItem.mList)
holder.childRecyclerView.adapter = adapter
}
override fun getItemCount(): Int {
return parentList.size
}
}
================================================ ====
下面是 ParentAdapter.kt
class ParentAdapter(private val parentList: List<ParentItem>,
private val listener : OnItemClickListener ) :
RecyclerView.Adapter<ParentAdapter.ParentViewHolder>() {
inner class ParentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
val logoIv: ImageView = itemView.findViewById(R.id.parentLogoIv)
val titleTv: TextView = itemView.findViewById(R.id.parentTitleTv)
val childRecyclerView: RecyclerView = itemView.findViewById(R.id.ch)
init {
itemView.setOnClickListener(this)
}
override fun onClick(p0: View?) {
val position : Int = adapterPosition
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position)
}
}
}
interface OnItemClickListener{
fun onItemClick(position: Int)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ParentViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.parent_item, parent, false)
return ParentViewHolder(view)
}
override fun onBindViewHolder(holder: ParentViewHolder, position: Int) {
val parentItem = parentList[position]
holder.logoIv.setImageResource(parentItem.logo)
holder.titleTv.text = parentItem.title
holder.childRecyclerView.setHasFixedSize(true)
holder.childRecyclerView.layoutManager = GridLayoutManager(holder.itemView.context, 3)
val adapter = ChildAdapter(parentItem.mList)
holder.childRecyclerView.adapter = adapter
}
override fun getItemCount(): Int {
return parentList.size
}
}
================================================ ==
下面是 ChildAdapter.kt
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class ChildAdapter(private val childList: List<ChildItem>,
private val listener : OnItemClickListener) :
RecyclerView.Adapter<ChildAdapter.ChildViewHolder>() {
inner class ChildViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener{
val logo: ImageView = itemView.findViewById(R.id.childLogoIv)
val title: TextView = itemView.findViewById(R.id.childTitleTv)
init {
itemView.setOnClickListener(this)
}
override fun onClick(p0: View?) {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION)
listener.onChildItemClick(position)
}
}
interface OnItemClickListener {
fun onChildItemClick(position: Int)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChildViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.child_item, parent, false)
return ChildViewHolder(view)
}
override fun onBindViewHolder(holder: ChildViewHolder, position: Int) {
holder.logo.setImageResource(childList[position].logo)
holder.title.text = childList[position].title
}
override fun getItemCount(): Int {
return childList.size
}
}
======================================
下面是 parent_item.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
app:cardCornerRadius="8dp"
app:cardElevation="5dp"
app:cardUseCompatPadding="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.cardview.widget.CardView
android:id="@+id/cardView"
android:layout_width="30dp"
android:layout_height="30dp"
app:cardCornerRadius="100dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/parentLogoIv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/parentTitleTv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="12dp"
android:text="Language"
android:textColor="@color/black"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="@+id/cardView"
app:layout_constraintStart_toEndOf="@id/cardView"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/childRecyclerView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:padding="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/constraintLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
================================================ ===========
下面是 child_item.xml
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="5dp"
app:cardUseCompatPadding="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/childCardView"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="8dp"
app:cardCornerRadius="100dp"
app:cardElevation="2dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/childLogoIv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/java" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/childTitleTv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginVertical="5dp"
android:text="Language"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/childCardView"
app:layout_constraintStart_toStartOf="@id/childCardView"
app:layout_constraintTop_toBottomOf="@+id/childCardView" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
================================================
下面是 activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout 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="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/parentRecyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
可以在onBindViewHolder中給View設置tag,設置點擊監聽獲取tag屬性,進行下一步邏輯。
下面是我寫的一個例子:這里我設置了整個View的點擊事件監聽器。
package com.example.nestedrecyclerview
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnClickListener
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.kotlinx.stackoverflowtestapplication.R
class ParentAdapter(private val parentList: List<ParentItem>,
private val listener : OnItemClickListener ) :
RecyclerView.Adapter<ParentAdapter.ParentViewHolder>() {
inner class ParentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val logoIv: ImageView = itemView.findViewById(R.id.parentLogoIv)
val titleTv: TextView = itemView.findViewById(R.id.parentTitleTv)
val childRecyclerView: RecyclerView = itemView.findViewById(R.id.ch)
}
private val onClickListener: OnClickListener = OnClickListener {
if (it.tag is Int) {
val position = it.tag
TODO()
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ParentViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.parent_item, parent, false)
view.setOnClickListener(onClickListener)
return ParentViewHolder(view)
}
override fun onBindViewHolder(holder: ParentViewHolder, position: Int) {
holder.itemView.tag = position
val parentItem = parentList[position]
holder.logoIv.setImageResource(parentItem.logo)
holder.titleTv.text = parentItem.title
holder.childRecyclerView.setHasFixedSize(true)
holder.childRecyclerView.layoutManager = GridLayoutManager(holder.itemView.context, 3)
val adapter = ChildAdapter(parentItem.mList)
holder.childRecyclerView.adapter = adapter
}
override fun getItemCount(): Int {
return parentList.size
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.