首页 > 解决方案 > android - 如何在适配器中正确设置 clickListener

问题描述

我的适配器中有以下逻辑:

 val listItem = modelCart[position]

    var number = 0
        holder.btnAdd.setOnClickListener {
            val textNumber = number++
            listItem.amount = textNumber.toString()
            holder.amount.text = listItem.amount
        }

我的目的是在每个项目上调用 clickListener(btnAdd) 时,该位置的数量增加 1 。

在上述逻辑中没有问题,并且在调用 clickListner 时每个项目的数量都会增加一。

但我认为不直接向适配器声明逻辑是更好的主意。我正在使用一个接口在相应的片段中实际声明上述逻辑。

所以在我的适配器中我声明了一个接口:

ClickListner 接口

interface ClickListener {
    fun onClick(modelCart: ModelCart , textView: TextView)
}

并在我的构造函数适配器中声明一个实例:

class MarketAdapter(
    private val modelCart: List<ModelCart> , private val clickListener: ClickListener
)

下面的代码可以更好地了解我的适配器:

 class ViewHolder(itemview: View) : RecyclerView.ViewHolder(itemview)

        val amount = itemview.amount_market
        val btnAdd = itemview.add_market


 override fun onBindViewHolder(holder: ViewHolder, position: Int)

 val listItem = modelCart[position]

// where the clickListner called .
 holder.btnAdd.setOnClickListener {
            clickListener.onClick(listItem , holder.amount)
        }

在我的片段中,我得到了界面:

  val list = ArrayList<ModelCart>()
        for (i in 0..50) {
            list.add(ModelCart(amount = "0", title ="pizza",price = "10$",image = R.drawable.pizza))
        }
        model = list
        recyclerView = view.findViewById(R.id.recyclerView_Market)

        recyclerView.layoutManager =
            LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false)

        recyclerView.adapter =

            MarketAdapter(model, object : ClickListener{
                var number = 0
                override fun onClick(modelCart: ModelCart , textView: TextView) {
                    modelCart.amount = number++.toString()
                    textView.text = modelCart.amount
                }
            })

这个逻辑不好用!!!我不知道这里到底发生了什么。

这必须像这样工作:每次调用 clickListner 时,每个位置的数量都应该增加。但这没有发生!第二个逻辑有什么问题?我怎样才能解决这个问题 ?

因此,如果有人可以帮助我,我将不胜感激。

标签: javaandroidkotlin

解决方案


为什么你不将你的听众传递给你的适配器?

    class MarketAdapter(
    private val modelCart: List<ModelCart> ,val clickListener: (ModelCart, TextView) -> Unit
    ){
     override fun onBindViewHolder(holder: ViewHolder, position: Int ) {
            holder.bind(modelCart[position], clickListener)
        }
}

在您的 viewHolder 之后:

class ViewHolder(itemview: View) : RecyclerView.ViewHolder(itemview)
fun bind(modelCart: ModelCart?, clickListener: (ModelCart, TextView) -> Unit)){
   holder.btnAdd.setOnClickListener {clickListener(modelCart, holder.)}
}

在片段/活动中

fun increaseValue(modelCart : ModelCart, view : TextView){
val textNumber = modelCart.amount.toInt()
textNumber++ 
modelCart.amount = textNumber.toString()
view.text = modelCart.amount

}

对于初始化:

MarketAdapter(model,  { modelCart: ModelCart, view:TextView -> increaseValue(modelCart, view) }
            })

我认为您的代码很好,但我不明白您的回调/接口 ClickListener 。我写得很快,可能有一些语法错误


推荐阅读