如何在 LiveData<List<Object>> 中添加和删除 <Object>?

how to add and delete <Object> from (and to) LiveData<List<Object>>?

我有一个 recyclerView,其中填充了 LiveData currentList。 我采用 Single 并在 onSuccess 方法中使用 currentList.setValue(people) 添加人员(请参见下面的代码)。 但是当我打开应用程序时,recyclerView 中只有 1 个对象。 我的任务是: 1)当应用程序打开时,它必须将 4 个人添加到 recyclerView(即到 currentList); 2) 在 onSwipe 方法之后,它必须删除第一个并从 RoomDatabase 添加 1 个新随机到 currentList 的末尾。

这意味着我需要将对象删除和添加到 LiveData 的方法。 我怎样才能做到这一点? (ViewModel代码如下)

public class PersonViewModel extends AndroidViewModel {
    private PersonRepository mRepository;
    private CompositeDisposable composite = new CompositeDisposable();
    private Single<List<Person>> mGuyWho;     // это нада??? LOBNYA
    private Single<Person> mGuy;      // PSKOV
    private MutableLiveData<List<Person>> currentList = new MutableLiveData<>();
    public PersonViewModel(@NonNull Application application) {
        super(application);
        mRepository = new PersonRepository(application);

        mGuyWho = mRepository.getGuyWho(); //это нада?? LOBNYA
        mGuy = mRepository.getGuy(); // PSKOV

        mGuyWho.subscribeOn(Schedulers.io())   // LOBNYA nachalo
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<List<Person>>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "onSubscribe(Disposable d): called");
                        composite.add(d);
                    }

                    @Override
                    public void onSuccess(List<Person> people) {
                        Log.d(TAG, "onSuccess: called");
                        currentList.setValue(people); // here I pass List to LiveData<List>
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: called");
                        Toast.makeText(application, "NO DATA", Toast.LENGTH_SHORT).show();
                    }
                });  // LOBNYA konets

        mGuy.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver<Person>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "onSubscribe(Disposable d): called");
                        composite.add(d);
                    }

                    @Override
                    public void onSuccess(Person person) {
                        Log.d(TAG, "onSuccess: called");
                        currentList.setValue(person); // there is an error, for I cannot bypass <Person> to LiveData<List<>>
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: called");
                    }
                })
        }
    LiveData<List<Person>> getCurrentList() {
        return currentList;
    }
};

您的 LiveData 由一个 List<Person> 对象组成:

private MutableLiveData<List<Person>> currentList = new MutableLiveData<>();

在您的 onSuccess() 方法中,您试图向它传递一个 Person 对象。您应该改为在其中传递 mutableListOf(Person()) 以使其工作。 但是,这仍然不能解决您的问题。

您需要做的是:

  1. 接收ViewHolder的onSwipe事件并调用viewModel中的remove方法。
  2. remove 方法应通过删除元素来修改您的 currentList。您可以将 id 传递给 remove 方法以简化操作。
  3. 因为currentListLiveData,每个observer都会收到通知。
  4. 然后您需要从 Room Database 中获取随机条目。
  5. 将此随机条目添加到 currentList。为此,您可以使用 LiveDataTransformations API。
  6. 再一次,因为 currentListLiveData,每个 Observer 都会收到通知。