如何在 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())
以使其工作。 但是,这仍然不能解决您的问题。
您需要做的是:
- 接收ViewHolder的
onSwipe
事件并调用viewModel
中的remove
方法。
- 此
remove
方法应通过删除元素来修改您的 currentList
。您可以将 id
传递给 remove
方法以简化操作。
- 因为
currentList
是LiveData
,每个observer
都会收到通知。
- 然后您需要从
Room Database
中获取随机条目。
- 将此随机条目添加到
currentList
。为此,您可以使用 LiveData
的 Transformations
API。
- 再一次,因为
currentList
是 LiveData
,每个 Observer
都会收到通知。
我有一个 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())
以使其工作。 但是,这仍然不能解决您的问题。
您需要做的是:
- 接收ViewHolder的
onSwipe
事件并调用viewModel
中的remove
方法。 - 此
remove
方法应通过删除元素来修改您的currentList
。您可以将id
传递给remove
方法以简化操作。 - 因为
currentList
是LiveData
,每个observer
都会收到通知。 - 然后您需要从
Room Database
中获取随机条目。 - 将此随机条目添加到
currentList
。为此,您可以使用LiveData
的Transformations
API。 - 再一次,因为
currentList
是LiveData
,每个Observer
都会收到通知。