如何在视觉上区分RecyclerView中最近点击的视图与所有其他视图?

问题描述 投票:0回答:1

我有一个包含照片的RecyclerView,我希望在点击照片时,它会有完全不透明度,而所有其他视图都有0.5f不透明度。

我尝试了很多不同的方法,但由于同样的原因,没有人能够幸存下来。这是一个简单尝试的例子,无论如何都不会很好地完成任务(因为它当时只处理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没有t具有属于屏幕上的lastPosition的视图,因此无法执行该命令。如果我不这样做,当使用滚动到该视图时,它仍将具有1.0f的alpha。

如果有一种完全不同的方法可以采取,我很乐意听到它。我想要的只是点击的图像具有完全不透明度,而其他所有图像都是0.5f。

android android-layout kotlin android-recyclerview recyclerview-layout
1个回答
1
投票

您可以在适配器类中尝试这样的事情:

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
    }
}

如果这有帮助,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.