如何在 recyclerview 中更改某些项目的属性
How to change certain item's properties in recyclerview
我想在单击图像视图时更改它的背景颜色,我在更改项目的位置属性时遇到了问题,它是 int,因为位置是 int,我无法访问它的属性,这是我的代码:
package com.example.myapplication.recyclerView.otherCategoryIcon
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.example.myapplication.R
import com.example.myapplication.icons
class OtherCategoryIcon(): RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
val list = icons
class ItemViewHolder(view: View): RecyclerView.ViewHolder(view) {
val icon: (ImageView) = view.findViewById(R.id.icon)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = list[position]
holder.icon.setImageResource(item)
holder.icon.setOnClickListener {
holder.icon.background = holder.itemView.context.resources.getDrawable(R.color.blue_400, null)
holder.icon.background.alpha = 75
val lastPosition = holder.adapterPosition - 1
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
return ItemViewHolder(adapter)
}
}
如何更改?
试试这个:
class OtherCategoryIcon(): RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
var lastViewHolder: ItemViewHolder? = null
val list = icons
class ItemViewHolder(view: View): RecyclerView.ViewHolder(view) {
val icon: (ImageView) = view.findViewById(R.id.icon)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = list[position]
holder.icon.setImageResource(item)
holder.icon.setOnClickListener {
holder.icon.background = holder.itemView.context.resources.getDrawable(R.color.blue_400, null)
holder.icon.background.alpha = 75
// last click viewholder
lastViewHolder?.let {
it.icon.background = it.itemView.context.resources.getDrawable(R.color.blue_400, null)
it.icon.background.alpha = 1.0
}
lastViewHolder = holder
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
return ItemViewHolder(adapter)
}
}
在当前设计中,每次绑定 ViewHolder 时都会创建一个新的 OnClickListener 对象。这可能会降低您的应用程序的速度,因此您应该转而将 ViewHolder 设为 OnClickListener。这是 Phil 回答的改进版本:
class OtherCategoryIcon: RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
var lastViewHolder: ItemViewHolder? = null
val list = icons
inner class ItemViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener {
private val icon: (ImageView) = view.findViewById(R.id.icon)
fun fill(item: Int){
icon.setImageResource(item)
icon.setOnClickListener(this)
}
override fun onClick(v: View?) {
//Android studio warns about using ResourcesCompat instead so here it is.
val background = ResourcesCompat.getDrawable(
itemView.context.resources,
R.color.blue_400,
null
)
icon.background = background
icon.background.alpha = 75
// last click viewHolder
lastViewHolder?.let {
it.icon.background = background
it.icon.background.alpha = 1
}
lastViewHolder = this
}
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = list[position]
holder.fill(item)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
return ItemViewHolder(adapter)
}
}
我想在单击图像视图时更改它的背景颜色,我在更改项目的位置属性时遇到了问题,它是 int,因为位置是 int,我无法访问它的属性,这是我的代码:
package com.example.myapplication.recyclerView.otherCategoryIcon
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.example.myapplication.R
import com.example.myapplication.icons
class OtherCategoryIcon(): RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
val list = icons
class ItemViewHolder(view: View): RecyclerView.ViewHolder(view) {
val icon: (ImageView) = view.findViewById(R.id.icon)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = list[position]
holder.icon.setImageResource(item)
holder.icon.setOnClickListener {
holder.icon.background = holder.itemView.context.resources.getDrawable(R.color.blue_400, null)
holder.icon.background.alpha = 75
val lastPosition = holder.adapterPosition - 1
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
return ItemViewHolder(adapter)
}
}
如何更改?
试试这个:
class OtherCategoryIcon(): RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
var lastViewHolder: ItemViewHolder? = null
val list = icons
class ItemViewHolder(view: View): RecyclerView.ViewHolder(view) {
val icon: (ImageView) = view.findViewById(R.id.icon)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = list[position]
holder.icon.setImageResource(item)
holder.icon.setOnClickListener {
holder.icon.background = holder.itemView.context.resources.getDrawable(R.color.blue_400, null)
holder.icon.background.alpha = 75
// last click viewholder
lastViewHolder?.let {
it.icon.background = it.itemView.context.resources.getDrawable(R.color.blue_400, null)
it.icon.background.alpha = 1.0
}
lastViewHolder = holder
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
return ItemViewHolder(adapter)
}
}
在当前设计中,每次绑定 ViewHolder 时都会创建一个新的 OnClickListener 对象。这可能会降低您的应用程序的速度,因此您应该转而将 ViewHolder 设为 OnClickListener。这是 Phil 回答的改进版本:
class OtherCategoryIcon: RecyclerView.Adapter<OtherCategoryIcon.ItemViewHolder>() {
var lastViewHolder: ItemViewHolder? = null
val list = icons
inner class ItemViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener {
private val icon: (ImageView) = view.findViewById(R.id.icon)
fun fill(item: Int){
icon.setImageResource(item)
icon.setOnClickListener(this)
}
override fun onClick(v: View?) {
//Android studio warns about using ResourcesCompat instead so here it is.
val background = ResourcesCompat.getDrawable(
itemView.context.resources,
R.color.blue_400,
null
)
icon.background = background
icon.background.alpha = 75
// last click viewHolder
lastViewHolder?.let {
it.icon.background = background
it.icon.background.alpha = 1
}
lastViewHolder = this
}
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = list[position]
holder.fill(item)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val adapter = LayoutInflater.from(parent.context).inflate(R.layout.icons_layout, parent, false)
return ItemViewHolder(adapter)
}
}