根据弗朗西斯科的回答(非常感谢!),以下是我如何实现基于 EditText 输入的类似动态数据库过滤,但在 Kotlin 中。
这是 Dao 查询示例,我根据传入的过滤器字符串执行选择:
// Dao query with filter
@Query("SELECT * from myitem WHERE name LIKE :filter ORDER BY _id")
fun getItemsFiltered(filter: String): LiveData<List<MyItem>>
我有一个存储库,但在这种情况下,它只是一个简单的传递。如果您没有存储库,则可以直接从 ViewModel 调用 dao 方法。
// Repository
fun getItemsFiltered(filter: String): LiveData<List<MyItem>> {
return dao.getItemsFiltered(filter)
}
然后在 ViewModel 中,我使用了 Francisco 也使用的 Transformations 方法。然而,我的过滤器只是一个包含在 MutableLiveData 中的简单字符串。 setFilter 方法发布新的过滤器值,这反过来会导致 allItemsFiltered 被转换。
// ViewModel
var allItemsFiltered: LiveData<List<MyItem>>
var filter = MutableLiveData<String>("%")
init {
allItemsFiltered = Transformations.switchMap(filter) { filter ->
repository.getItemsFiltered(filter)
}
}
// set the filter for allItemsFiltered
fun setFilter(newFilter: String) {
// optional: add wildcards to the filter
val f = when {
newFilter.isEmpty() -> "%"
else -> "%$newFilter%"
}
filter.postValue(f) // apply the filter
}
请注意,初始过滤器值设置为通配符(“%”)以默认返回所有项目。如果您不设置此项,则在您调用 setFilter 之前不会观察到任何项目。
这是我观察 allItemsFiltered 并应用过滤的片段中的代码。请注意,当我的搜索 EditText 更改以及视图状态恢复时,我会更新过滤器。后者将设置您的初始过滤器,并在屏幕旋转时恢复现有过滤器值(如果您的应用支持)。
// Fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// observe the filtered items
viewModel.allItemsFiltered.observe(viewLifecycleOwner, Observer { items ->
// update the displayed items when the filtered results change
items.let { adapter.setItems(it) }
})
// update the filter as search EditText input is changed
search_et.addTextChangedListener {text: Editable? ->
if (text != null) viewModel.setFilter(text.toString())
}
}
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
// update the filter to current search text (this also restores the filter after screen rotation)
val filter = search_et.text?.toString() ?: ""
viewModel.setFilter(filter)
}
希望有帮助!!
免责声明:这是我的第一篇文章,如果我遗漏了什么,请告诉我。我不确定如何链接到弗朗西斯科的答案,否则我会这样做。它绝对帮助我实现了我的实现。