实施(网络)搜索 android

Implementing (network) search android

我迷路了。

最近几天,我试图了解在我的 Android 应用程序中实现网络搜索的最佳方式。

我想保留 MVVM 架构,但如果要求太多,我准备考虑替代方案。

我需要能够在页面中搜索。

好的example\guide将不胜感激。

谢谢。

使用 Android 的分页库,您可以完成分页网络搜索,并使用您的结果更新 RecyclerView。

假设您有一个 API,我们可以使用它来调用搜索查询。这将得到您将实施的 DataSource 的支持,它将在您滚动时提供新的结果页面。

interface MySearchApi {
    fun search(query: String, count: Int): PagedList<SearchResult>
}

我们得到的是 PagedList,它会随着更多搜索结果的加载而更新。我们没有将其包装在 Rx Observable 或 LiveData 对象中,因为在这种情况下我们不希望加载的数据发生变化。如果您正在查询某种可能随时更改结果的实时服务,您可能需要考虑一下。

我们可以从我们的 ViewModel 对象公开此分页列表或 LiveData,并构建一个 PagedListAdapter 子类,它将在加载新数据时更新 RecyclerView。

class MySearchAdapter() :
        PagedListAdapter<SearchResult, SearchResultViewHolder>(DIFF_CALLBACK) {
    fun onBindViewHolder(holder: SearchResultViewHolder, position: Int) {
        val concert: SearchResult? = getItem(position)

        // Note that "searchResult" is a placeholder if it's null.
        holder.bindTo(searchResult)
    }

    companion object {
        private val DIFF_CALLBACK = object :
                DiffUtil.ItemCallback<Concert>() {
            // Concert details may have changed if reloaded from the database,
            // but ID is fixed.
            override fun areItemsTheSame(oldSearchResult: SearchResult,
                    newSearchResult: SearchResult) = oldSearchResult.id == newSearchResult.id

            override fun areContentsTheSame(oldSearchResult: SearchResult,
                    newSearchResult: Concert) = newSearchResult == newSearchResult
        }
    }
}

将其与 RecyclerView 连接起来就像您通常使用任何其他 Adapter 和 RecyclerView 一样,并且您的 PagedList 应该在需要新数据页时通知您的数据源。

您可以阅读有关分页架构的更多信息here