如何在视觉上将 RecyclerView 中最近单击的视图与所有其他视图区分开来?
How can I visually differentiate the recently clicked view in a RecyclerView from all other views?
我有一个带照片的 RecyclerView,我希望当照片被点击时,它具有完全不透明度,而所有其他视图具有 0.5f 不透明度。
我试过很多不同的方法,none出于同样的原因通过了测试。这是一个简单尝试的例子,它无论如何都不会很好地完成任务(因为它当时只处理 2 个视图)但是会很好地解释我所面对的墙:
fun changeRecyclerViewOpacity(currentPosition : Int){
val clickedView = myLayoutManager.findViewByPosition(currentPosition)
val previouslyClickedView = myLayoutManager.findViewByPosition(lastPosition)
clickedView!!.alpha = 1f
previouslyClickedView!!.alpha = 0.5f
lastPosition = currentPosition
}
我遇到的这个问题以及我尝试过的其他方法是,如果(例如)屏幕一次显示 3 张图像,并且我的 lastPosition 是 2,currentPosition 是 10,应用程序会崩溃因为 layoutManager 在屏幕上没有属于 lastPosition 的视图,所以它无法执行命令。
如果我不这样做,当使用滚动到那个视图时,它仍然会有 1.0f 的 alpha。
如果可以采用完全不同的方法,我很想听听。我想要的只是点击图像具有完全不透明度,而所有其他图像都是 0.5f。
你可以在你的适配器中尝试这样的事情 class:
var selectedPosition = 0 // You have to set this globally in the Adapter class
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items.get(position)
// Update alpha
var alpha: Float = 0.5f
if(selectedPosition == position) {
alpha = 1.0f
}
holder.itemView!!.alpha = alpha
}
class ViewHolder : RecyclerView.ViewHolder, View.OnClickListener {
public ViewHolder(itemView: View) {
super(itemView);
itemView.setOnClickListener(this);
}
override
public fun onClick(v: View) {
// Below line is just like a safety check, because sometimes holder could be null,
// in that case, getAdapterPosition() will return RecyclerView.NO_POSITION
if (getAdapterPosition() == RecyclerView.NO_POSITION) return
// Updating old as well as new positions
notifyItemChanged(selectedPosition)
selectedPosition = getAdapterPosition()
// Do your another stuff for your onClick
}
}
如果有帮助请告诉我!
我有一个带照片的 RecyclerView,我希望当照片被点击时,它具有完全不透明度,而所有其他视图具有 0.5f 不透明度。
我试过很多不同的方法,none出于同样的原因通过了测试。这是一个简单尝试的例子,它无论如何都不会很好地完成任务(因为它当时只处理 2 个视图)但是会很好地解释我所面对的墙:
fun changeRecyclerViewOpacity(currentPosition : Int){
val clickedView = myLayoutManager.findViewByPosition(currentPosition)
val previouslyClickedView = myLayoutManager.findViewByPosition(lastPosition)
clickedView!!.alpha = 1f
previouslyClickedView!!.alpha = 0.5f
lastPosition = currentPosition
}
我遇到的这个问题以及我尝试过的其他方法是,如果(例如)屏幕一次显示 3 张图像,并且我的 lastPosition 是 2,currentPosition 是 10,应用程序会崩溃因为 layoutManager 在屏幕上没有属于 lastPosition 的视图,所以它无法执行命令。 如果我不这样做,当使用滚动到那个视图时,它仍然会有 1.0f 的 alpha。
如果可以采用完全不同的方法,我很想听听。我想要的只是点击图像具有完全不透明度,而所有其他图像都是 0.5f。
你可以在你的适配器中尝试这样的事情 class:
var selectedPosition = 0 // You have to set this globally in the Adapter class
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items.get(position)
// Update alpha
var alpha: Float = 0.5f
if(selectedPosition == position) {
alpha = 1.0f
}
holder.itemView!!.alpha = alpha
}
class ViewHolder : RecyclerView.ViewHolder, View.OnClickListener {
public ViewHolder(itemView: View) {
super(itemView);
itemView.setOnClickListener(this);
}
override
public fun onClick(v: View) {
// Below line is just like a safety check, because sometimes holder could be null,
// in that case, getAdapterPosition() will return RecyclerView.NO_POSITION
if (getAdapterPosition() == RecyclerView.NO_POSITION) return
// Updating old as well as new positions
notifyItemChanged(selectedPosition)
selectedPosition = getAdapterPosition()
// Do your another stuff for your onClick
}
}
如果有帮助请告诉我!