Android Livedata观察员的多个实例
我正在努力寻找一种解决方案,在一个活动中多次调用livedata observer,而不是创建它的多个实例,这会导致在数据库更改时出现问题,我从所有实例得到了回调 视图模型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
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 forratingsList
)……然后在该值更改时分别调用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
}