【问题标题】:Trying to change the drawable of Image view on clicking it in list adapter在列表适配器中单击时尝试更改图像视图的可绘制对象
【发布时间】:2021-04-14 09:36:40
【问题描述】:

实际上,问题是当我单击单个项目的图像视图时,它的可绘制对象正在发生变化,但许多其他随机项目的图像视图也会随着单击而发生变化。下面是我的列表适配器代码。我已经从一些来源看到了这个问题的解决方案,我发现设置标签然后设置点击侦听器是可行的,但它对我不起作用。作为参考,addMealItem 是单击时要更改的视图的 id。我什至添加了 toast 来测试出了什么问题,但是 toast 在这种情况下并不是很有帮助。


class FoodsAdapter(application: Application, val context: Context, val clickListener: MealItemclickListener) : ListAdapter<MealItemModel, FoodsAdapter.ViewHolder>(MealItemDiffCallBack()) {
    val database = MealItemDatabase.getInstance(application)

    class ViewHolder private constructor(val binding: MealitemBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(item: MealItemModel, clickListener: MealItemclickListener, context: Context, database: MealItemDatabase) {
            binding.food = item
            GlobalScope.launch {
                withContext(Dispatchers.IO) {
                    if(database.mealItemDao.getBreakfastItem(item.itemTitle)!=null) {
                        if (database.mealItemDao.getBreakfastItem(item.itemTitle).likedOrNot) {
                            binding.addmealItem.setTag("unliked")
                            withContext(Dispatchers.Main){
                                Toast.makeText(context,"Unliked",Toast.LENGTH_LONG).show()
                            }
                            binding.addmealItem.setImageResource(R.drawable.ic_add_button)
                        } else {
                            withContext(Dispatchers.Main){
                                Toast.makeText(context,"Liked",Toast.LENGTH_LONG).show()
                            }
                            binding.addmealItem.setTag("liked")
                            binding.addmealItem.setImageResource(R.drawable.ic_add_button_filled)
                        }
                    }
                }
            }
            binding.addmealItem.setOnClickListener {
                clickListener.onClick(item)
                GlobalScope.launch {
                    withContext(Dispatchers.IO) {
                        if(database.mealItemDao.getBreakfastItem(item.itemTitle)!=null) {
                            if (database.mealItemDao.getBreakfastItem(item.itemTitle).likedOrNot) {
                                binding.addmealItem.setTag("unliked")
                                withContext(Dispatchers.Main){
                                    Toast.makeText(context,"Unliked",Toast.LENGTH_LONG).show()
                                }
                                binding.addmealItem.setImageResource(R.drawable.ic_add_button)
                                database.mealItemDao.getBreakfastItem(item.itemTitle).likedOrNot = false
                            } else {
                                binding.addmealItem.setTag("liked")
                                withContext(Dispatchers.Main){
                                    Toast.makeText(context,"Liked",Toast.LENGTH_LONG).show()
                                }
                                binding.addmealItem.setImageResource(R.drawable.ic_add_button_filled)
                                database.mealItemDao.getBreakfastItem(item.itemTitle).likedOrNot = true
                            }
                        }
                    }
                }
            }

//            binding.addmealItem.setOnClickListener {
//                clickListener.onClick(item)
//                if (binding.addmealItem.drawable.constantState!!.equals(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_add_button, null)!!.constantState)) {
//                    binding.addmealItem.setImageResource(R.drawable.ic_add_button_filled)
//                } else {
//                    binding.addmealItem.setImageResource(R.drawable.ic_add_button)
//                }
//            }
            binding.executePendingBindings()
        }

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding = MealitemBinding.inflate(layoutInflater, parent, false)
                return ViewHolder(binding)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(item, clickListener, context, database)
    }
}

class MealItemDiffCallBack : DiffUtil.ItemCallback<MealItemModel>() {
    override fun areItemsTheSame(oldItem: MealItemModel, newItem: MealItemModel): Boolean {
        return oldItem == newItem
    }

    override fun areContentsTheSame(oldItem: MealItemModel, newItem: MealItemModel): Boolean {
        return oldItem.itemTitle == newItem.itemTitle
    }
}

class MealItemclickListener(val clickListener: (foodTitle: String) -> Unit) {
//    var flag = false
    fun onClick(mealItem: MealItemModel) {
//        flag = !flag
        return clickListener(mealItem.itemTitle)
    }
}  

【问题讨论】:

    标签: java android android-studio kotlin adapter


    【解决方案1】:

    如果您想要实现的是某种类似/不同的功能。 您应该尝试创建自定义可绘制对象。

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:android:state_enabled="true"
          android:drawable="@android:color/liked"/>
    <item android:drawable="@android:color/unliked"/>
    </selector>
    

    使用它作为 xml 中图像的可绘制对象,您将能够通过访问视图来访问和切换图像的两种状态

    addMealItem.isEnabled=true //(or false) this should be able to do the switching easily.
    

    【讨论】:

    • 它会仅更改适配器中特定项目的图像视图,还是会在适配器回收其视图时更改随机项目的图像视图?
    • 您附加上述可绘制对象的项目,您需要在该项目上调用 isEnabled 设置器,因此只有一个会更改。
    • 不,我猜你问错了。 addMealItem 只是布局的图像视图的 id,我所说的项目是指回收器视图将显示的适配器的整个项目(布局)。因此,适配器中随机项目的 addMealItem(id of image view) 可能会发生变化,因为它只是回收了我不想要的视图持有者。
    【解决方案2】:

    如果您想动态更改可绘制颜色,请使用它,即

    (itemBinding.tvGrade.background as GradientDrawable).setColor(Color.parseColor(item?.gradeColor))
    
    

    如果您想以编程方式更改可绘制对象,请这样做

    binding.workBtn.setBackgroundResource(R.drawable.work_selected_bg)
    
    

    【讨论】:

    • 没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多