Как искать / фильтровать из источника данных списка страниц в Android - PullRequest
0 голосов
/ 04 апреля 2019

Issue

Я настраиваю данные с помощью 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 Ответ

0 голосов
/ 11 апреля 2019

Шаг 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)
        })
    }

Примечание: я получил эту идею из поста здесь, но я не помню, где и кто

...