Привязка данных Android использует необработанные изменяемые данные

#android #data-binding #android-databinding #android-livedata

#Android #привязка данных #android-привязка данных #android-livedata

Вопрос:

Я хочу передать a MutableLiveData<Integer> в ClickListener, без того, чтобы привязка данных автоматически разворачивала его и просто передавала Integer . Существует ли специальный синтаксис, позволяющий указать привязке данных оставить MutableLiveData<Integer> в покое и просто передать его как есть? вот пример:

 <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="@{v -> viewmodel.doSomething(viewmodel.myMutableLiveData1)}" />
 

Затем я бы пошел дальше и изменил значение myMutableLiveDataX in doSomething()

Причина всего этого в том, что у меня несколько myMutableLiveDataX s, и все они делают то же самое, но с разными данными, я не хочу создавать doSomething1() doSomething2() и т.д…

Одним из возможных, но неуклюжих обходных путей было бы, конечно, обернуть MutableLiveData другой объект и передать его, когда MutableLiveData требуется raw, а затем использовать getter для этого объекта всякий раз, когда используются развернутые данные.

Комментарии:

1. Если вы вызываете метод из viewmodel и передаете данные из viewmodel, то зачем вообще передавать данные? Просто используйте дату внутри метода, который вы вызываете?

2. @SamirSpahic причина в том, что я хочу использовать один и тот же метод для разных данных, например doSomething(data1) , doSomething(data2) , и т.д. doSomething(data3) Если я использую данные непосредственно в методе, мне нужно будет повторить один и тот же метод несколько раз.

Ответ №1:

Возможно, это то, что вам нужно

В Kotlin

 fun doSomething(data: MutableLiveData<Any>){
        val value=data.value
        when(value){
            is String->{}
            is Int->{}
            is YourCustomType->{}
        }
    }
 

В Java

 void doSomething(MutableLiveData<Object> data){
        Object value=data.getValue();
        if(value instanceof Integer){}
        else if(value instanceof String){}
        else if(value instanceof YourCustomType){}
    }
 

Комментарии:

1. Проблема не в doSomething методе, а в автоматически сгенерированном коде привязки данных из XML. Он автоматически развернет MutableLiveData<Object> и передаст Object напрямую