Android 在使用Room和LiveData执行新的get方法后,如何刷新UI?
我正在使用JetPack架构编写android应用程序(我还将Sunflower应用程序作为灵感) 我有一个包含任务列表的回收器视图。为了得到它们,我在视图模型中使用下面的函数。初始负载正常工作 然而,我也有一个日期选择器,我想将finishedDate更新到新的日期,以获得前一天完成的任务 更新finishedDate变量或调用另一个getTaskByFinishedDate函数来重新分配任务(将作用域从val更改为var后)不会产生任何效果。我仍然只显示初始任务 “观察”功能在此字段(LiveData)中正常工作,因为如果我添加具有当前显示的完成日期的新任务,我将在UI上看到它 我只是无法在初次通话后将其筛选到不同的日期 代码如下: 视图模型:Android 在使用Room和LiveData执行新的get方法后,如何刷新UI?,android,kotlin,android-room,android-livedata,android-jetpack,Android,Kotlin,Android Room,Android Livedata,Android Jetpack,我正在使用JetPack架构编写android应用程序(我还将Sunflower应用程序作为灵感) 我有一个包含任务列表的回收器视图。为了得到它们,我在视图模型中使用下面的函数。初始负载正常工作 然而,我也有一个日期选择器,我想将finishedDate更新到新的日期,以获得前一天完成的任务 更新finishedDate变量或调用另一个getTaskByFinishedDate函数来重新分配任务(将作用域从val更改为var后)不会产生任何效果。我仍然只显示初始任务 “观察”功能在此字段(Liv
fun updateDate(year: Int, month: Int, day: Int) {
finishedDate.set(Calendar.YEAR, year)
finishedDate.set(Calendar.MONTH, month)
finishedDate.set(Calendar.DAY_OF_MONTH, day)
// tasks: LiveData<List<Task>> = taskRepository.getTasksByFinishedDate(finishedDate)
}
val tasks: LiveData<List<Task>> = taskRepository.getTasksByFinishedDate(finishedDate)
final LiveData<..> mObservableTasks = repo.getObservableTasks();
public LiveData<..> getObservableTasks(){
return mObservableTasks;
}
日期选择器:
private val model: NewTaskViewModel by activityViewModels()
override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
this.year = year
this.month = month
this.day = day
model.updateDate(year, month, day)
}
问题的解决方案称为
MediatorLiveData
其思想是,您可以在ViewModel中保留一个最终的LiveData对象,并且只调整中介的源文件
:
在回购协议中:
private MediatorLiveData<List<Tasks>> mObservableTasks;
private LiveData<List<SeedEntity>> tasks;
private DataRepository(...) {
...
tasks = mDatabase.myDao().getTasksByFinishedDate(defaultDate);
mObservableTasks = new MediatorLiveData<>();
mObservableTasks.addSource(tasks,
taskLists-> {
if (mDatabase.getDatabaseCreated().getValue() != null) {
mObservableTasks.postValue(taskLists);
}
});
}
public void updateDate(Calendar finishedDate)
{
mObservableTasks.removeSource(tasks);
tasks = mDatabase.myDao().getTasksByFinishedDate(finishedDate);
mObservableTasks.addSource(tasks,
taskLists-> {
if (mDatabase.getDatabaseCreated().getValue() != null)
mObservableTasks.postValue(taskLists);
});
public LiveData<List<Tasks>> getObservableTasks(){
return mObservableTasks;
}
希望这能说明问题;) 你们正在更新房间里的字段吗?
private MediatorLiveData<List<Tasks>> mObservableTasks;
private LiveData<List<SeedEntity>> tasks;
private DataRepository(...) {
...
tasks = mDatabase.myDao().getTasksByFinishedDate(defaultDate);
mObservableTasks = new MediatorLiveData<>();
mObservableTasks.addSource(tasks,
taskLists-> {
if (mDatabase.getDatabaseCreated().getValue() != null) {
mObservableTasks.postValue(taskLists);
}
});
}
public void updateDate(Calendar finishedDate)
{
mObservableTasks.removeSource(tasks);
tasks = mDatabase.myDao().getTasksByFinishedDate(finishedDate);
mObservableTasks.addSource(tasks,
taskLists-> {
if (mDatabase.getDatabaseCreated().getValue() != null)
mObservableTasks.postValue(taskLists);
});
public LiveData<List<Tasks>> getObservableTasks(){
return mObservableTasks;
}
final LiveData<..> mObservableTasks = repo.getObservableTasks();
public LiveData<..> getObservableTasks(){
return mObservableTasks;
}
ViewModel.mObservableTasks.observe(viewLifecycleOwner) { result ->
adapter.submitList(result)
}