android MVVM体系结构中的排序回收程序视图

nzrxty8p  于 2022-11-03  发布在  Android
关注(0)|答案(1)|浏览(137)

我有一个在MVVM体系结构中实现的回收器视图和房间数据库。创建此查询以在DAO文件中排序回收器视图。

@Query("SELECT * FROM task_table ORDER BY " +
            "CASE WHEN:choice =1 THEN date END ASC," +
            "CASE WHEN:choice=2 THEN title END ASC")
    fun readAllData(choice : Int): LiveData<MutableList<Task>>

存储库文件

class TaskRepository(private val taskDao: TaskDao) {
    val readAllData: LiveData<MutableList<Task>> = taskDao.readAllData(1)

    suspend fun addTask(task: Task) {
        taskDao.addTask(task)
    }

    suspend fun deleteTask(task: Task) {
        taskDao.deleteTask(task)
    }

    suspend fun updateTask(task: Task) {
        taskDao.updateTask(task)
    }

    fun deleteAllTasks() {
        taskDao.deleteAllTasks()
    }
}

视图模型文件

class TaskViewModel(
    application: Application,
) : AndroidViewModel(application) {
    val readAllData: LiveData<MutableList<Task>>
    private val repository: TaskRepository

    init {
        val taskDao = TaskDatabase.getDatabase(application).taskDao()
        repository = TaskRepository(taskDao)
        readAllData = repository.readAllData
    }

    fun addTask(task: Task) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.addTask(task)
        }
    }

    fun updateTask(task: Task) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.updateTask(task)
        }
    }

    fun deleteTask(task: Task) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.deleteTask(task)
        }
    }

    fun deleteAllTask() {
        viewModelScope.launch(Dispatchers.IO) {
            repository.deleteAllTasks()
        }
    }
}

我不知道如何在UI中实现排序菜单,以使我的房间数据库按属性排序。这意味着我想将数据从Fragment传递到Repository文件,以便DAO可以带参数。

xdnvmnnf

xdnvmnnf1#

首先,您不希望将MutableListLiveData一起使用。如果您只想添加/删除LiveData中的值,则底层对象不会更改,您也不会从中获得更新。
最常见的方法(AFAIK)是使用LiveData来修改查询。通过Transformations.switchMap的组合,您可以使用一个LiveData的输出并将其转换为另一个LiveData(您的查询)。

class TaskViewModel(application: Application) : AndroidViewModel(application) {

    private val taskDao: TaskDatabase.getDatabase(application).taskDao()
    private val repository: TaskRepository = TaskRepository(taskDao)

    private val _filter: MutableLiveData<Int> = MutableLiveData(1)
    val filter: LiveData<Int>
        get() = _filter

    private val _data: MutableLiveData<List<Task>> = Transformations.switchMap(filter) { choice ->
        repository.readAllData(choice)
    }
    val readAllData: LiveData<List<Task>>
        get() = _data

    fun updateFilter(filter: Int) {
        _filter.postValue(filter)
    }
}

_filter中的任何更改都将通过switchMap触发重新评估,switchMap将从您的repository中获取readAllData

相关问题