簡體   English   中英

如何在 RecyclerView kotlin 上的兩個不同視圖上實現兩個 OnClickListener?

[英]How to implement two OnClickListener on two different views on RecyclerView kotlin?

我正在處理一個包含兩個視圖的 RecyclerView 項目:一個 TextView 和一個 ImagaView。 我希望能夠同時單擊它們來執行不同的功能。

我怎么能 go 關於這個

這是我的適配器


class AddMeasurementAdapter(private val currentList:MutableList<DressMeasurementModel>, private val listener1: RecyclerClickListener, private val listener2: RecyclerClickListener): RecyclerView.Adapter<AddMeasurementAdapter.CardViewHolder>() {

    //inner class
    inner class CardViewHolder (itemView : View):RecyclerView.ViewHolder(itemView), View.OnClickListener{
        val display:TextView = itemView.findViewById(R.id.measurement_recyclerview_item)
        //Binding the data with the view
        fun  bind(dressMeasurementModel: DressMeasurementModel){
            display.text = "${dressMeasurementModel.measurementName} ${dressMeasurementModel.measurement}"

        }

        init {
            itemView.setOnClickListener(this@CardViewHolder)
        }

        override fun onClick(v: View?) {
            val position: Int = adapterPosition
            if (position != RecyclerView.NO_POSITION) {
                listener1.onItemClick1(position, currentList)

            }

            if (position != RecyclerView.NO_POSITION) {
                listener2.onItemClick2(position, currentList)

            }

        }


    }


    //Creating view
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.measurement_fragment_recyclerview_items, parent, false)

        return CardViewHolder(view)
    }
    //Binding the view
    override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        holder.bind(currentList[position])
    }
    //Getting the item cout size
    override fun getItemCount(): Int {
        return currentList.size
    }

}

這是我的界面

interface RecyclerClickListener {
    fun onItemClick1(position: Int, currentList: MutableList<DressMeasurementModel>)
    fun onItemClick2(position: Int, currentList: MutableList<DressMeasurementModel>)
}

您可以在 createViewHolder 中添加一個偵聽器,例如

//Creating view
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.measurement_fragment_recyclerview_items, parent, false)
        view.textView.onClick{}
        view.image.onClick{}
        return CardViewHolder(view)
}

好的,這是答案的Kotlin版本。

在視圖的bind方法中,

fun bind(dressMeasurementModel: DressMeasurementModel) {
    ...
    var position = adapterPosition

    display.setOnClickListener {
        listener.onTextClick(position)
    }

    image.setOnClickListener {
        listener.onImageClick(position)
    }
    ...
}

后來我想通了所以我想分享我是怎么做到的。

class AddMeasurementAdapter(
    private val currentList: MutableList<DressMeasurementModel>,
    private val listener1: RecyclerClickListener,
    private val listener2: RecyclerClickListener
) : RecyclerView.Adapter<AddMeasurementAdapter.CardViewHolder>() {

    // inner class
    inner class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val display: TextView = itemView.findViewById(R.id.measurement_recyclerview_item)
        val delete: ImageView = itemView.findViewById(R.id.measurementment_recyclerview_item_delete_button)
//        Binding the data with the view
        fun bind(dressMeasurementModel: DressMeasurementModel) {
            display.text = "${dressMeasurementModel.measurementName} ${dressMeasurementModel.measurement}"
        }
    }

    // Creating view
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(
            R.layout.measurement_fragment_recyclerview_items,
            parent,
            false
        )

        return CardViewHolder(view)
    }
    // Binding the view and attaching the listener
    override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        holder.bind(currentList[position])
        
        holder.display.setOnClickListener {
            listener1.onItemClickToEdit(holder.adapterPosition, currentList)
        }

        holder.delete.setOnClickListener {
            listener2.onItemClickToDelete(holder.adapterPosition, currentList)
        }
    }
    // Getting the item cout size
    override fun getItemCount(): Int {
        return currentList.size
    }
}

當我在fun bind()中分配 onClickListener 時,監聽器覆蓋了整個 itemView 布局,而不是布局內的單個視圖,因此只實現了一次單擊監聽器。 內部 class 內部也應用了相同的東西。

這是界面

interface RecyclerClickListener {
    fun onItemClickToEdit(position: Int, currentList: MutableList<DressMeasurementModel>)
    fun onItemClickToDelete(position: Int, currentList: MutableList<DressMeasurementModel>)
}

通過在片段的任一活動中擴展接口,您就有了 onclickListener。

這篇文章幫助了https://antonioleiva.com/recyclerview-listener/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM