Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Android Livedata观察员的多个实例_Android_Reactive Programming_Android Architecture Components_Android Livedata - Fatal编程技术网

Android Livedata观察员的多个实例

Android Livedata观察员的多个实例,android,reactive-programming,android-architecture-components,android-livedata,Android,Reactive Programming,Android Architecture Components,Android Livedata,我正在努力寻找一种解决方案,在一个活动中多次调用livedata observer,而不是创建它的多个实例,这会导致在数据库更改时出现问题,我从所有实例得到了回调 视图模型 public class RatingsViewModel extends AndroidViewModel { private RatingsRepository ratingsRepository; private LiveData<List<Rating>> ratingsList; pub

我正在努力寻找一种解决方案,在一个活动中多次调用livedata observer,而不是创建它的多个实例,这会导致在数据库更改时出现问题,我从所有实例得到了回调

视图模型

public class RatingsViewModel extends AndroidViewModel {

private RatingsRepository ratingsRepository;
private LiveData<List<Rating>> ratingsList;

public RatingsViewModel(Application application) {
    super(application);
    ratingsRepository = new RatingsRepository(application);

}

public LiveData<List<Rating>> getRatingsByDate(LocalDate date) {
    ratingsList = ratingsRepository.getActivitiesByDate(date);
    return ratingsList;
}

我尝试调用hasObserver(),但它返回false,因此我无法删除观察者。

您应该能够执行以下操作(在Kotlin中,但如果需要,应该可以轻松地在Java中翻译)

val-dateLiveData:MutableLiveData=MutableLiveData()
val ratingsList=MediatorLiveData().apply{
this.addSource(dateLiveData){
this.value=ratingsRepository.getActivitiesByDate(dateLiveData.value)
}
}
乐趣设置日期(日期:日期){
dateLiveData.value=日期
}

例如,在您的活动/片段中,您可以从
onCreate()
调用
observe
,然后在该值更改时调用
setDate()

我不明白,为什么您要在方法中观察并传递日期?。在viewmodel中创建一个setter,并在其中传递日期,然后数据库给出可以在视图的OnCreate()中观察到的结果activity@PrashanthVerma当用户单击显示这些数据的日期时,日期是动态的,因此您必须使用新日期拨打电话。我不理解你在viewmodel中使用setter的解决方案。请参阅
android.arch.lifecycle.Transformations
实用程序类让我直说吧。有一个日期是由用户选择的,您需要获取该日期并在数据库中搜索,然后在屏幕上显示它。没错。!?仔细阅读部分-特别要注意
“类似于map(),将函数应用于LiveData对象中存储的值,并将结果展开并分发到下游”
,因此这里的逻辑是观察观察者的参数?,谢谢。您可以调用例如
ratingsViewModel.ratingsList.observe()
(或者通过getter for
ratingsList
)……然后在该值更改时分别调用
setDate(date)
。@AgonAvdijaj您有机会尝试一下吗?是的,非常感谢,但我使用了转换方法。
private void getRatingsByDate(LocalDate date) {
    ratingsViewModel.getRatingsByDate(date).observe(this, activities -> {
        // list populating stuff
    });
}
val dateLiveData: MutableLiveData<Date> = MutableLiveData()

val ratingsList = MediatorLiveData<List<Rating>>().apply {
    this.addSource(dateLiveData) {
        this.value = ratingsRepository.getActivitiesByDate(dateLiveData.value)
    }
}

fun setDate(date: Date) {
    dateLiveData.value = date
}