java - 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 时,每个位置的数量都应该增加。但这没有发生!第二个逻辑有什么问题?我怎样才能解决这个问题 ?
因此,如果有人可以帮助我,我将不胜感激。
解决方案
为什么你不将你的听众传递给你的适配器?
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 。我写得很快,可能有一些语法错误
推荐阅读
- animation - 动画 SVG 属性填充以在动画后进行渐变填充
- image - 在磁盘上保存代表图像的几个 Numpy 数组的列表
- javascript - 在 ajax 脚本之后运行 event.preventDefault() 时,有什么方法可以按名称获取多个 POST 请求?
- relational-database - 这个简单的基于 SQL 的 ETL 解决方案有什么问题?
- python - OpenCV - 斑点/缺陷/异常检测
- python - 如果两个字符串的含义相同,如何获得概率
- c++ - 在 enum_class 中覆盖 operator++ 是否正确?
- excel - 在服务器端数据表 laravel 中导出文件时更改方程式的问题
- haskell - 如何在 Haskell 中修改 RWST 环境变量?
- java - 错误:无法找到或加载主类 org.apache.flink.client.cli.CliFrontend