Как фильтровать Livedata или Rxjava текучий - PullRequest
1 голос
/ 05 октября 2019

Используя модификацию, я получаю текучие данные с сервера, затем в viewmodel я конвертирую текучие данные в Livedata и, наконец, наблюдаю LiveData в действии. Внутренняя деятельность Я использую Livedata для моего recyclerView.

Но мне нужно отфильтровать данные с некоторым условием и получить отфильтрованный список данных в виде LiveData. Как и где мне это сделать? Могу ли я отфильтровать Livedata?

Шаги, которые я делаю:

  1. В моем классе MainApi : вызов веб-службы с использованием модернизации, которая возвращает текучий результат
public interface MainApi {
    @GET("xx")
    Flowable<List<User>> getUsers();
}
В моем классе репозитория :
public class MainRepository {
    public Flowable<List<User>> fetchUsersFromServer() {   
        Flowable<List<User>> returnedData = mainApi
            .getUsers()
            .subscribeOn(Schedulers.io());

        return returnedData;
    }   
}
В моем классе viewModel : получить текучую среду из репозитория и преобразовать в LiveData
public class MainViewModel extends ViewModel {
    MediatorLiveData<List<User>> liveUsers = new MediatorLiveData();

    public void getUsersFromServer() {

    final LiveData<List<User>> source = LiveDataReactiveStreams.fromPublisher( mainRepository.fetchUsersFromServer());

    liveUsers.addSource(source, new Observer<List<User>>() {
          @Override
          public void onChanged(List<User> users) {
              liveUsers.setValue(users);
              liveUsers.removeSource(source);
          }
        });     
    }
}   
Наконец, наблюдаем LiveData из Activity и показываем данные в Recyclerview

1 Ответ

0 голосов
/ 07 октября 2019

Вы можете выполнить фильтрацию в наблюдаемой, которую вы возвращаете из mainRepository.fetchUsersFromServer(), прежде чем конвертировать ее в LiveData.

public void getUsersFromServer() {
        Flowable<List<User>> usersObservable = mainRepository.fetchUsersFromServer()
                .filter(new Predicate<List<User>>() {
                    @Override
                    public boolean test(List<User> users) throws Exception {
                        return !users.isEmpty(); // put your filter condition
                    }
                });
        final LiveData<List<User>> source = LiveDataReactiveStreams.fromPublisher(usersObservable);
        liveUsers.addSource(source, new Observer<List<User>>() {
            @Override
            public void onChanged(List<User> users) {
                liveUsers.setValue(users);
                liveUsers.removeSource(source);
            }
        });
    }
...