Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何添加和删除<;对象>;从(和到)LiveData<;列表<;对象>>;?_Java_Android_Mvvm_Rx Java2_Android Livedata - Fatal编程技术网

Java 如何添加和删除<;对象>;从(和到)LiveData<;列表<;对象>>;?

Java 如何添加和删除<;对象>;从(和到)LiveData<;列表<;对象>>;?,java,android,mvvm,rx-java2,android-livedata,Java,Android,Mvvm,Rx Java2,Android Livedata,我有一个recyclerView,里面充满了LiveData currentList。 我使用onSuccess方法中的currentList.setValue(people)获取Single并添加person(参见下面的代码)。 但当我打开应用程序时,recyclerView中只有一个对象。 我的任务是: 1) 当应用程序打开时,必须将4人添加到recyclerView(即当前列表); 2) 在onSwipe方法之后,它必须删除第一个,并将RoomDatabase中的1个新随机数添加到curr

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

这意味着我需要删除和向LiveData添加对象的方法。 我该怎么做?(ViewModel代码如下所示)

公共类PersonViewModel扩展了AndroidViewModel{
私人储存库;
private CompositeDisposable composite=新CompositeDisposable();
私人单身男女;男/女/女
私有单个mGuy;//PSKOV
私有MutableLiveData currentList=新的MutableLiveData();
public PersonViewModel(@NonNull应用程序){
超级(应用);
mRepository=新人员存储库(应用程序);
mGuyWho=mRepository.getGuyWho();//LOBNYA
mGuy=mRepository.getGuy();//PSKOV
mGuyWho.subscribeOn(Schedulers.io())//LOBNYA-nachalo
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新的SingleObserver(){
@凌驾
认购的公共无效(一次性d){
Log.d(标记“onSubscribe(disposabled):调用”);
添加(d);
}
@凌驾
成功时公开作废(列出人员){
Log.d(标记“onSuccess:called”);
currentList.setValue(people);//这里我将列表传递给LiveData
}
@凌驾
公共无效申报人(可丢弃的e){
Log.d(标记“onError:called”);
Toast.makeText(应用程序,“无数据”,Toast.LENGTH_SHORT).show();
}
});//LOBNYA konets
mGuy.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新的SingleObserver(){
@凌驾
认购的公共无效(一次性d){
Log.d(标记“onSubscribe(disposabled):调用”);
添加(d);
}
@凌驾
成功时公开作废(人){
Log.d(标记“onSuccess:called”);
currentList.setValue(person);//有一个错误,因为我无法绕过到LiveData
}
@凌驾
公共无效申报人(可丢弃的e){
Log.d(标记“onError:called”);
}
})
}
LiveData getCurrentList(){
返回当前列表;
}
};

您的
LiveData
列表
对象组成:

private MutableLiveData<List<Person>> currentList = new MutableLiveData<>();
private MutableLiveData currentList=new MutableLiveData();
在您的
onSuccess()
方法中,您试图向它传递一个
Person
对象。您应该在其中传递
mutableListOf(Person())
,使其工作但是,这仍然不能解决您的问题。

您需要执行以下操作:

  • 接收ViewHolder的
    onswip
    事件,并在
    viewModel
    中调用
    remove
    方法
  • remove
    方法应通过删除元素来修改您的
    currentList
    。您可以将
    id
    传递给
    remove
    方法,以简化操作
  • 因为
    currentList
    LiveData
    每个
    观察者都会收到通知
  • 然后您需要从
    房间数据库
    中获取随机条目
  • 将此随机条目添加到
    currentList
    。为此,您可以使用
    LiveData
    Transformations
    API
  • 同样,由于
    currentList
    LiveData
    ,每个
    观察者都会收到通知

  • 多谢各位。然而,ViewModel中的remove方法应该是什么样子?(假设我必须从Livedata中删除)
    private MutableLiveData currentList=new MutableLiveData()
    列表
    本质上是不可更改的,即不能添加和删除。要实现这一点,最好使用
    ArrayList
    。您只需调用列表中的
    currentList.remove(element)
    ,即可。我的适配器不知道通过滑动删除了哪个项目。当我刷卡时,当前数据会被更新和删除;但当我刷下一个,是更新和删除,但不是从视图;同时,第三个从视图中删除(因为适配器尝试查找项1而不是项0,而在删除项0之后,项1已成为项0,项2已分别成为项1,但适配器不知道这一点,我不知道如何同步此项..)您不需要在
    适配器上设置这些操作,因为
    适配器的
    任务是管理
    列表本身,而不是
    元素。在
    ViewHolder
    类中设置这些
    onClickListeners
    。您的
    ViewHolder
    将具有
    Person
    元素。一个干净的解决方案是创建一个
    EventListener
    接口。将此
    EventListener
    作为
    参数
    传递给
    适配器
    EventListener
    实例显然就是您的
    viewModel
    。同样在
    RecyclerView
    onBindInstance()
    方法中,将
    EventListener
    传递给
    ViewHolder
    a
    private MutableLiveData<List<Person>> currentList = new MutableLiveData<>();