繁体   English   中英

在 ListView 适配器中从 function 内部调用时,Textview 数据未更新

[英]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 的另一个参数。保持bindinggetView()中的局部变量,而不是属性。

当它不是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM