Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/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 在使用Room和LiveData执行新的get方法后,如何刷新UI?_Android_Kotlin_Android Room_Android Livedata_Android Jetpack - Fatal编程技术网

Android 在使用Room和LiveData执行新的get方法后,如何刷新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

我正在使用JetPack架构编写android应用程序(我还将Sunflower应用程序作为灵感)

我有一个包含任务列表的回收器视图。为了得到它们,我在视图模型中使用下面的函数。初始负载正常工作

然而,我也有一个日期选择器,我想将finishedDate更新到新的日期,以获得前一天完成的任务

更新finishedDate变量或调用另一个getTaskByFinishedDate函数来重新分配任务(将作用域从val更改为var后)不会产生任何效果。我仍然只显示初始任务

“观察”功能在此字段(LiveData)中正常工作,因为如果我添加具有当前显示的完成日期的新任务,我将在UI上看到它

我只是无法在初次通话后将其筛选到不同的日期

代码如下:

视图模型:

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)
}