如何在视觉上将 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
    }
}

如果有帮助请告诉我!