Шаг 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)
})
}
Примечание: я получил эту идею из поста здесь, но я не помню, где и кто