Как я могу визуально отличить недавно нажатый вид в RecyclerView от всех других видов? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть 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 не имеет представления, которое принадлежит lastPosition на экране, поэтому он не может выполнить команду. Если я этого не сделаю, то при использовании прокрутки к этому представлению у него все равно будет альфа на 1.0f.

Если бы существовал совершенно другой подход, я бы с удовольствием его услышал. Все, что я хочу, это чтобы изображение было полностью прозрачным, а все остальные - 0.5f.

1 Ответ

1 голос
/ 13 апреля 2019

Вы можете попробовать что-то вроде этого в своем классе адаптера:

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

Дайте мне знать, если это помогло!

...