Использование привязки данных для выделения выбранной строки recyclerview

Я пытаюсь выделить строку моего recyclerview, когда пользователь нажимает на нее.

Макет строки Recyclerview:

<data>
    <variable name="model" type="ItemRow" />
    <variable name="listener" type="ItemClickListener" />
</data>

<com.google.android.material.card.MaterialCardView       
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView            
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{model.name}"
        android:onClick="@{() -> listener.onItemClicked(model)}"           
        android:background="@{model.isSelected ? @drawable/white : @drawable/blue}"/>

</com.google.android.material.card.MaterialCardView>

OnClickListener создается в действии:

ItemClickListener listener = item -> viewModel.selectItem(item);

Модель представления устанавливает для свойства isSelected элемента Item значение true:

public void selectItem(Item item)
{
    item.setSelected(true);        
}

Однако это не меняет фон строки. Отладка кода показывает, что для свойства isSelected элемента установлено значение true. Есть что-то, что мне не хватает?


person user8114848    schedule 23.04.2019    source источник
comment
Разве вы не должны уведомить адаптер об изменении элемента? notifyItemChanged(<position of item>. Кроме того, по какой причине вы не используете селекторы вместо привязки данных?   -  person Fred    schedule 24.04.2019
comment
Селекторы @Fred, как в библиотеке выбора recyclerview? решил, что это было излишним, так как я просто хочу выбрать 1 строку. Я пытался использовать notifyItemChanged и notifydatasetchanged, но это не помогло.   -  person user8114848    schedule 24.04.2019
comment
TBH Я никогда не слышал о такой библиотеке. Я имел в виду селекторы Android, предназначенные именно для этого варианта использования. У него есть другое название — StateList.   -  person Fred    schedule 24.04.2019


Ответы (1)


Используйте BaseObservable

class Item extends BaseObservable {
    private boolean isSelected = false;

    @Bindable
    public boolean getIsSelected() {
        return isSelected;
    }

    public void setSelected(Boolean isSelected) {
        this.isSelected = isSelected;
        //Probably it'll has other name, i haven't testing it
        notifyPropertyChanged(BR.selected); 
    }

}

Он будет работать без notfiyDataSetChanged

person syncended    schedule 29.11.2020