实施(网络)搜索android

时间:2019-07-15 13:47:35

标签: android search searchview searchable

我迷路了。

最近几天,我试图了解什么是在Android应用中实施网络搜索的最佳方法。

我想保留MVVM体系结构,但是如果要问的太多,我准备考虑替代方案。

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

一个很好的例子\指南将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

使用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应该在需要新数据页面时通知您的DataSource。

您可以阅读有关分页体系结构here的更多信息。

相关问题