【发布时间】: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