LiveData обновляет значения при изменении поля объекта - PullRequest
0 голосов
/ 09 июля 2019

Сегодня я пытаюсь использовать объект LiveData (MutableLiveData) для получения некоторых динамических значений. (в шаблоне MVVM)

Я использовал такой объект модели:

public class Object {
    private String name;
    private float internalvalue;
    private float in1;
    private float out1;
    private float out2;

    public Object(String name, float internalvalue){
        this.name = name;
        this.internalvalue = internalvalue;
    }

    public float getOut1(){
        return this.out1;
    }

    public float getOut2(){
        return this.out2;
    }

    public void setIn1(float in1){
        this.in1 = in1;

    }

    private void performSomething(float internalvalue, float in1){
        SubClassSingleton.performSomething(internalvalue, in1, new SubClassSingletonListener() {
            @Override
            public void onSuccess(float out1, float out2){
                this.out1 = out1;
                this.out2 = out2;
            }
        });
    }
}

Я использую ViewModel следующим образом:

public class MainViewModel {
    public MutableLiveData<Object> obj;

    public MainViewModel(){
        this.obj = new MutableLiveData<>();
        this.obj.postValue(new Object("Name", 50.0f);
    }
}

В основном фрагменте:

public class MainFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        MainViewModel viewModel = ViewModelProviders.of(this).get(MainViewModel.class);
        MainFragmentBinding binding = MainFragmentBinding.inflate(getLayoutInflater());
        binding.setViewModel(viewModel);
        binding.setLifecycleOwner(this);
        return binding.getRoot();
    }
}

И в поле зрения:

<layout ...
    <data>
        <variable
            name="viewModel"
            type="app.example.MainViewModel"/>
    </data>
    <LinearLayout
        ...>
        <EditText
            android:text="@={viewModel.obj.in1}"
            .../>
        <TextView
            android:text="@{viewModel.obj.out1}"
            .../>
        <TextView
            android:text="@{viewModel.obj.out2}"
            .../>
    </LinearLayout>
</layout>

Я бы хотел обновить свое представление при обновлении значений (out1, out2) моей модели (при выполнении вычисления).

Как я могу это сделать?

1 Ответ

1 голос
/ 21 июля 2019

Попробуйте это:

Вам нужно сделать так, чтобы класс вашей модели расширял BaseObservable.

public class Object extends BaseObservable {
    private String name;
    private float internalvalue;
    private float in1;
    private float out1;
    private float out2;

    public Object(String name, float internalvalue) {
        this.name = name;
        this.internalvalue = internalvalue;
    }

    public float getOut1() {
        return this.out1;
    }

    public void setOut1(float out1) {
        this.out1 = out1;
        notifyChange();
    }

    public float getOut2() {
        return this.out2;
    }

    public void setOut2(float out2) {
        this.out2 = out2;
        notifyChange();
    }

    public void setIn1(float in1) {
        this.in1 = in1;
    }

    private void performSomething(float internalvalue, float in1) {
        SubClassSingleton.performSomething(internalvalue, in1, new SubClassSingletonListener() {
            @Override
            public void onSuccess(float out1, float out2) {
                setOut1(out1);
                setOut2(out2);
            }
        });
    }
}

А в View нельзя напрямую привязать float для просмотра. Это должна быть строка, так что связывайте так:

<layout ...
    <data>
        <variable
            name="viewModel"
            type="app.example.MainViewModel"/>
    </data>
    <LinearLayout
        ...>
        <EditText
            android:text='@={""+viewModel.obj.in1}'
            .../>
        <TextView
            android:text='@{""+viewModel.obj.out1}'
            .../>
        <TextView
            android:text='@{""+viewModel.obj.out2}'
            .../>
    </LinearLayout>
</layout>
...