【问题标题】:How to search/filter from a paged list data source in Android如何从 Android 中的分页列表数据源中搜索/过滤
【发布时间】:2025-12-15 19:30:02
【问题描述】:

问题

我正在使用 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);

            }
        });

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

【问题讨论】:

    标签: android android-room pagedlist


    【解决方案1】:

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

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

    【讨论】: