Установите состояние элемента в RecyclerView, выбранном при нажатии на него


Я думаю, что это будет очень легко реализовать, но после нескольких часов поиска я не смог найти что-то полезное, чтобы заставить его работать. Я хочу установить выбранный элемент, который пользователь нажимает в ящике, этот список является RecyclerView. В окне просмотра моего адаптера у меня есть событие onClick для элементов:

@Override
public void onClick(View v) {
   notifyItemChanged(selectedItem);
   selectedItem = getPosition();
   notifyItemChanged(selectedItem);
}

Элемент типа int для отслеживания выбранного элемента.

Теперь в onBindViewHolder я делаю это:

holder.itemView.setSelected(position == selectedItem);

Но кажется, что выбранное состояние никогда не вызывается потому что у меня есть android: background, настроенный на строку items с этим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected="true"
        android:drawable="@drawable/border_bottom_selected"
        android:color="@color/backgroundToolbar"/>
    <item android:drawable="@drawable/border_bottom" />
</selector>
Нормальное состояние работает, поэтому я знаю, что фон хорошо применяется.

Итак, как я могу установить выбранное состояние для элемента в RecyclerView?

2 4

2 ответа:

Удалите прослушиватель onclick из держателя вида.

В onBindViewHolder сделайте следующее:

viewHolder.itemView.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            notifyItemChanged(selectedItem);
            selectedItem = position;
            notifyItemChanged(selectedItem);
        }
    });
    holder.itemView.setSelected(position == selectedItem);

Я надеюсь, что это может решить вашу проблему.

Ну, покопавшись еще немного и попытавшись понять, каким образом android реализует стили из xml, я обнаружил, что для изменения цвета текста (что-то я не сказал в своем вопросе) в конкретном TextView вы должны установить свойство android:color="@drawable/bg_item" (bg_item-это файл, который содержит селектор и в каждом элементе свойство android: color), что-то вроде этого: {[3]]}

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected="true"
        android:drawable="@drawable/border_bottom_selected"
        android:color="@color/backgroundToolbar" />
    <item android:drawable="@drawable/border_bottom"
        android:color="@color/colorTextTitleTab"/>
</selector>