android - 如何从 Android 中的分页列表数据源中搜索/过滤
问题描述
问题
我正在使用 PagedList 设置数据。如何在使用 Room 时过滤/搜索列表。
我尝试在发出请求时过滤 DataSource 类上的列表,但希望使其从加载的初始结果中过滤。
itemViewModel = ViewModelProviders.of(getActivity).get(ItemViewModel.class);
itemViewModel.itemPagedList.observe(this, new Observer<PagedList<Item>>() {
@Override
public void onChanged(@Nullable PagedList<Item> items) {
itemsAdapter.submitList(items);
}
});
我希望在搜索中提交过滤后的分页列表。
解决方案
第 1 步:例如,从数据源中获取过滤后的数据
@WorkerThread
@Query("SELECT * from chats where isGroup = :isGroup AND chatName LIKE :query")
fun search(query: String, isGroup: Int = 0): DataSource.Factory<Int, Chat>
第 2 步:检查结果是否不为空删除旧观察者并观察新结果(将结果传递给 replaceSubscription 函数)
第 3 步:结束搜索再次从过滤后的数据中删除观察者并重新观察旧数据(将 null 传递给 replaceSubscription 函数)
fun search(query: String?) {
if (query.isNullOrEmpty()) {
return
}
Log.d(ChatsFragment::class.java.simpleName, "search")
Log.d(ChatsFragment::class.java.simpleName, "search($query: String?)")
viewModel.search(query = "$query%", result = object :
ChatFragmentViewModel.SearchResult {
override fun result(chats: LiveData<PagedList<Chat>>?) {
if (chats != null) {
isInSearchMode = true
replaceSubscription(chats)
}
}
})
}
替换订阅功能
fun replaceSubscription(lifecycleOwner: LifecycleOwner, data:LiveData<PagedList<Chat>>? = null) {
chats.removeObservers(lifecycleOwner)
chats = data ?: result.pagedList
}
观察功能
private fun observeChats() {
Log.d(ChatsFragment::class.java.simpleName, "observeChats")
viewModel.chats.observe(this, Observer<PagedList<Chat>> { data ->
getNumberOfUnreadMessagesAtAll(data.snapshot())
chatsAdapter.submitList(data)
})
// start observing for networkState
viewModel.networkState.observe(this, Observer {
chatsAdapter.setNetworkState(it)
})
}
注意:我从这里的帖子中得到这个想法,但我不记得在哪里和谁
推荐阅读
- regex - 在正则表达式中什么是变长lookbehind-assertion?
- python - Pandas 访问数据框中的列表元素?
- python - PyCharm 专业版中的自动格式化导入
- python - 与 FastAPI 中的 flask.copy_current_request_context 相同吗?
- django - 如果字段有数据,Django 得到 True/False
- python - 在python中运行而不刷新屏幕
- ms-access - MS-Access - 报告分组
- html - 防止重叠的两个 HTML5 SVG 的颜色变深
- google-bigquery - 如何对 BigQuery 中的多个 NUMERIC 字段求和?
- build.gradle - 在 doLast 块中未获取 Gradle 项目属性最新值