Обновить список MutableLiveData - PullRequest
0 голосов
/ 24 марта 2020

У меня в MyViewModel переменная класса MutableLiveData items, которая хранит список класса Item. Существует также функция fuction fetchData(), которая получает данные из библиотеки webService от Retrofit, и функция checkStatus(), которая для каждого элемента в списке должна выполнять проверку, когда пользователь нажимает кнопку.

Мой вопрос: как правильно обновить элемент в списке, хранящемся в объекте MutableLiveData? Является ли мое решение приемлемым или вы знаете какое-нибудь лучшее решение?

Item. java

public class Item {
    int id;
    String status;
}

MyViewModel. java

public class MyViewModel extends ViewModel {

    private MutableLiveData<List<Item>> items = new MutableLiveData<>();
    //... rest of variables

    public void fetchData() {
        // get list from webService

        webService.fetchItems()
                .subscribeOn(Schedulers.io())
                .observceOn(AndroidSchedulers.mainThread())
                .observe(result -> items.postValue(result.data));
    }

    public void checkStatus() {
        // for every item on list perform check

        List<Item> itemList = items.getValue();
        for(Item item : itemList) {
            webService.check(item.id)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .observe(result -> {
                        item.status = result.status;
                        itemList.set(itemList.indexOf(item), item);
                        items.postValue(items.getValue());
                    });
        }
    }
}

MainActivity. java

public class MainActivity extends AppCompatActivity {

    private RecyclerViewAdapter viewAdapter;
    private MyViewModel viewModel;
    // rest of standard code...


    // called somewhere in onCreate method
    private void subscribeObservers() {
        viewModel.observeItems().observe(this, items -> {
            if(items != null) {
                viewAdapter.setItems(items);
            }
        });
    }

    // user check click button listener
    public void onClick(View view) {
        viewModel.checkStatus();
    }
}

1 Ответ

0 голосов
/ 12 апреля 2020

Я думаю, вы можете использовать хранилище для архитектуры mvvm. Вы можете сослаться на здесь

...