首页 > 解决方案 > 如何从 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);

            }
        });

我希望在搜索中提交过滤后的分页列表。

标签: androidandroid-roompagedlist

解决方案


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

注意:我从这里的帖子中得到这个想法,但我不记得在哪里和谁


推荐阅读