Java 尝试在列表适配器中单击图像视图以更改其可绘制性
实际上,问题是当我点击单个项目的图像视图时,它的可绘制性正在改变,但许多其他随机项目的图像视图也随着点击而改变。下面是我的列表适配器代码。我已经从一些来源看到了这个问题的解决方案,我发现设置标签然后设置click listeners是可行的,但对我来说不起作用。作为参考,addMealItem是单击时要更改的视图的id。我甚至添加了toast来测试什么是错误的,但是在这种情况下,toast并没有多大帮助Java 尝试在列表适配器中单击图像视图以更改其可绘制性,java,android,android-studio,kotlin,adapter,Java,Android,Android Studio,Kotlin,Adapter,实际上,问题是当我点击单个项目的图像视图时,它的可绘制性正在改变,但许多其他随机项目的图像视图也随着点击而改变。下面是我的列表适配器代码。我已经从一些来源看到了这个问题的解决方案,我发现设置标签然后设置click listeners是可行的,但对我来说不起作用。作为参考,addMealItem是单击时要更改的视图的id。我甚至添加了toast来测试什么是错误的,但是在这种情况下,toast并没有多大帮助 class FoodsAdapter(application: Application,
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)
}
}
类FoodAdapter(应用程序:应用程序,val上下文:上下文,val clickListener:MealItemclickListener):ListAdapter(MealItemDiffCallBack()){
val数据库=MealItemDatabase.getInstance(应用程序)
类ViewHolder私有构造函数(val绑定:MealitemBinding):RecyclerView.ViewHolder(binding.root){
趣味绑定(项:MealItemModel,clickListener:MealItemclickListener,上下文:上下文,数据库:MealItemDatabase){
食物
环球镜发射{
withContext(Dispatchers.IO){
if(database.mealItemDao.getBreakfastItem(item.itemTitle)!=null){
if(database.mealItemDao.getBreakfastItem(item.itemTitle.likedOrNot){
binding.addmealItem.setTag(“未链接”)
withContext(Dispatchers.Main){
Toast.makeText(上下文,“未链接”,Toast.LENGTH\u LONG.show())
}
binding.addmealItem.setImageResource(R.drawable.ic_添加_按钮)
}否则{
withContext(Dispatchers.Main){
Toast.makeText(上下文“喜欢”,Toast.LENGTH\u LONG.show())
}
binding.addmealItem.setTag(“喜欢”)
binding.addmealItem.setImageResource(R.drawable.ic\u添加按钮\u填充)
}
}
}
}
binding.addmealItem.setOnClickListener{
单击Listener.onClick(项目)
环球镜发射{
withContext(Dispatchers.IO){
if(database.mealItemDao.getBreakfastItem(item.itemTitle)!=null){
if(database.mealItemDao.getBreakfastItem(item.itemTitle.likedOrNot){
binding.addmealItem.setTag(“未链接”)
withContext(Dispatchers.Main){
Toast.makeText(上下文,“未链接”,Toast.LENGTH\u LONG.show())
}
binding.addmealItem.setImageResource(R.drawable.ic_添加_按钮)
database.mealItemDao.getBreakfastItem(item.itemTitle).likedOrNot=false
}否则{
binding.addmealItem.setTag(“喜欢”)
withContext(Dispatchers.Main){
Toast.makeText(上下文“喜欢”,Toast.LENGTH\u LONG.show())
}
binding.addmealItem.setImageResource(R.drawable.ic\u添加按钮\u填充)
database.mealItemDao.getBreakfastItem(item.itemTitle).likedOrNot=true
}
}
}
}
}
//binding.addmealItem.setOnClickListener{
//单击Listener.onClick(项目)
//if(binding.addmealItem.drawable.constantState!!.equals(ResourcesCompat.getDrawable(context.resources,R.drawable.ic_添加按钮,null)!!.constantState)){
//binding.addmealItem.setImageResource(R.drawable.ic\u添加按钮\u填充)
//}其他{
//binding.addmealItem.setImageResource(R.drawable.ic_添加_按钮)
// }
// }
binding.executePendingBindings()
}
伴星{
乐趣来自(父:视图组):视图持有者{
val layoutInflater=layoutInflater.from(parent.context)
val绑定=测量绑定。充气(LAYOUTINGER、parent、false)
返回视图保持器(绑定)
}
}
}
override onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{
返回ViewHolder.from(父级)
}
覆盖BindViewHolder(holder:ViewHolder,位置:Int){
val item=getItem(位置)
绑定(项目、clickListener、上下文、数据库)
}
}
类MealItemDiffCallBack:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:MealItemModel,新项:MealItemModel):布尔值{
返回oldItem==newItem
}
覆盖相同的内容(旧项:MealItemModel,新项:MealItemModel):布尔值{
返回oldItem.itemTitle==newItem.itemTitle
}
}
类MealItemclickListener(val clickListener:(foodTitle:String)->单位){
//var标志=false
趣味onClick(mealItem:MealItemModel){
//flag=!flag
返回clickListener(mealItem.itemTitle)
}
}
如果您试图实现的是类似/不同的功能。
您应该尝试创建一个自定义的可绘制图形
<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>
如果要动态更改可绘制颜色,请使用此选项,即
(itemBinding.tvGrade.background as GradientDrawable).setColor(Color.parseColor(item?.gradeColor))
如果您想以编程方式更改drawable,请执行以下操作
binding.workBtn.setBackgroundResource(R.drawable.work_selected_bg)
它只会在适配器中更改特定项目的图像视图,还是会在适配器回收其视图时更改随机项目的图像视图?您将上述可绘制项目附加到的项目,您需要调用该项目上的isEnabled setter,以便只更改其中一个。不,我想您的问题搞错了。addM
binding.workBtn.setBackgroundResource(R.drawable.work_selected_bg)