【问题标题】:Logic for items binding in RecyclerView in KotlinKotlin 中 RecyclerView 中项目绑定的逻辑
【发布时间】:2021-10-27 11:05:30
【问题描述】:

我想在为 RecyclerView 绑定 ViewHolder 时为项目添加一些逻辑。 我的适配器如下所示:

class MyAdapter(): ListAdapter<Item, MyAdapter.ItemViewHolder>(DiffCallback()){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder{
        val binding = MyItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ItemViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val currentItem = getItem(position)
        holder.bind(currentItem)
    }

    inner class ItemViewHolder(private val binding: MyItemBinding): RecyclerView.ViewHolder(binding.root){
        
        fun bind(item: Item){
            binding.apply {
                tvStar.text = ""
                tvValueA.text = item.ValueA
                tvValueB.text = item.ValueB                

            }
        }

我需要更改 tvStar.text 取决于 item.ValueA 和 item.ValueB 中的值。像这样的:

binding.apply {
                if (item.ValueA == 0.toFloat()){
                    tvStar.text = ""
                }else if (item.ValueA != item.ValueB){
                    tvStar.text = "-"
                } else if (item.ValueA == item.ValueB){
                    tvStar.text = "*"
                }
}

如果 ValueA(Float 类型)为零,则文本应为空,如果两个值不同且 ValueA 不为零,则文本应为“-”,当两个值相同时,文本应为“* ”。 我尝试了这个解决方案,但它不起作用。

【问题讨论】:

  • 究竟是什么不起作用,错误或意外结果是什么?
  • 尝试在代码中添加 Log.d 或断点
  • @mightyWOZ 谢谢你们,我写错了变量名。

标签: android kotlin android-recyclerview android-adapter


【解决方案1】:

您可以使用以下代码:

class MyAdapter(): ListAdapter<Item, MyAdapter.ItemViewHolder>(DiffCallback()) {

    ...
    inner class ItemViewHolder(private val binding: MyItemBinding): RecyclerView.ViewHolder(binding.root){
        fun bind(item: Item){
            binding.apply {
                tvStar.text = when {
                    item.ValueA == 0f -> ""
                    item.ValueA == item.ValueB -> "*"
                    else -> "-"
                }
            }
        }
    }
    ...
}

并确保该位置的项目具有正确的 ValueAValueB 值。

【讨论】:

    【解决方案2】:

    我像这样更改了代码。看起来我的值名称有一些错误。

    binding.apply {
                    tvStar.text =  if (item.ValueA == 0.toFloat()){
                        ""
                    }else (if (item.ValueA != item.ValueB){
                                    "-"
                                } else if (item.ValueA == item.ValueB){
                                    "*"
                                } else{
                                    ""
                                })}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-30
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多