[英]Textview data is not being updated when called inside from function in ListView Adapter
在 ListView 适配器中从 function 内部调用时,Textview 数据未更新。 请帮助设置binding.tvQ.text
class CustomPizzaListAdapter (private val context: Context, private val pizzaItemList: ArrayList<PizzaItemList>) : BaseAdapter() {
private lateinit var binding: CustomPizzaItemListLayoutBinding
override fun getCount(): Int {
return pizzaItemList.size
}
override fun getItem(position: Int): Any {
return position
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
@SuppressLint("ViewHolder")
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
binding = CustomPizzaItemListLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
val current = pizzaItemList[position]
Picasso.get().load(current.img).into(binding.imgPizza)
binding.tvPizzaTitle.setText(current.Name)
binding.tvPizzaDesc.setText(current.Desc)
setPrice(binding.rgSize.checkedRadioButtonId, position)
val mPosition = position
binding.rgSize.setOnCheckedChangeListener { group, checkedId ->
setPrice(checkedId, mPosition)
}
binding.btnPlusQ.setOnClickListener {
binding.tvQ.text = (binding.tvQ.text.toString().toInt() + 1).toString()
Toast.makeText(context, binding.tvQ.text, Toast.LENGTH_LONG).show()
setPrice(binding.rgSize.checkedRadioButtonId, mPosition)
}
binding.btnMinusQ.setOnClickListener {
if(binding.tvQ.text.toString().toInt() > 0){
binding.tvQ.text = (binding.tvQ.text.toString().toInt() - 1).toString()
Toast.makeText(context, binding.tvQ.text, Toast.LENGTH_LONG).show()
setPrice(binding.rgSize.checkedRadioButtonId, mPosition)
}
}
return binding.root
}
private fun setPrice(checkedId: Int, position: Int) {
val current = pizzaItemList[position]
val price: Float
when (checkedId) {
binding.rgSmall.id -> {
price = binding.tvQ.text.toString().toInt() * current.smPrice!!
binding.tvPrice.text = "Price Small $$price"
Toast.makeText(context, "Price Small $price", Toast.LENGTH_SHORT).show()
}
binding.rgMedium.id -> {
price = binding.tvQ.text.toString().toInt() * current.mPrice!!
binding.tvPrice.text = "Price Medium $$price"
Toast.makeText(context, "Price Medium $price", Toast.LENGTH_SHORT).show()
}
binding.rgLarge.id -> {
price = binding.tvQ.text.toString().toInt() * current.lgPrice!!
binding.tvPrice.text = "Price Large $$price"
Toast.makeText(context, "Price Large $price", Toast.LENGTH_SHORT).show()
}
else -> {
Toast.makeText(context,"Wrong",Toast.LENGTH_LONG).show()
}
}
}
}
当我尝试从 textview 获取文本时,它会在 toast 中返回 textview 的正确更新数据,但 toast 没有被更新。 尝试搜索如何更新视图但没有任何效果。
你不应该有这个绑定属性:
private lateinit var binding: CustomPizzaItemListLayoutBinding
每次调用getView()
时都会设置它,因此它始终是最近滚动到屏幕上或即将滚动到屏幕上的视图的绑定。 单击列表中的每个视图都会更新此最新绑定中的视图。
相反,使binding
成为setPrice
function 的另一个参数。保持binding
为getView()
中的局部变量,而不是属性。
当它不是 null 时,您还应该使用convertView
,以便可以回收您的视图。 这有助于在滚动时保持 animation 流畅。 因此,将您的代码更改为以下内容:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val binding = if (convertView == null) {
CustomPizzaItemListLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
} else {
CustomPizzaItemListLayoutBinding.bind(convertView)
}
val current = pizzaItemList[position]
Picasso.get().load(current.img).into(binding.imgPizza)
binding.tvPizzaTitle.setText(current.Name)
binding.tvPizzaDesc.setText(current.Desc)
setPrice(binding.rgSize.checkedRadioButtonId, position, binding)
binding.rgSize.setOnCheckedChangeListener { group, checkedId ->
setPrice(checkedId, position, binding)
}
binding.btnPlusQ.setOnClickListener {
binding.tvQ.text = (binding.tvQ.text.toString().toInt() + 1).toString()
Toast.makeText(context, binding.tvQ.text, Toast.LENGTH_LONG).show()
setPrice(binding.rgSize.checkedRadioButtonId, position, binding)
}
binding.btnMinusQ.setOnClickListener {
if(binding.tvQ.text.toString().toInt() > 0){
binding.tvQ.text = (binding.tvQ.text.toString().toInt() - 1).toString()
Toast.makeText(context, binding.tvQ.text, Toast.LENGTH_LONG).show()
setPrice(binding.rgSize.checkedRadioButtonId, position, binding)
}
}
return binding.root
}
private fun setPrice(checkedId: Int, position: Int, binding: CustomPizzaItemListLayoutBinding) {
//...
}
顺便说一下,我不知道你的override fun getItem(position: Int): Any
function 来自哪里。 它不是 Android BaseAdapter class 的一部分。但看起来它做错了事。 它不应该返回一个PizzaItemList
项目,而不是传入的 position 吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.