我迷路了。
最近几天,我试图了解什么是在Android应用中实施网络搜索的最佳方法。
我想保留MVVM体系结构,但是如果要问的太多,我准备考虑替代方案。
我需要能够在页面中搜索。
一个很好的例子\指南将不胜感激。
谢谢。
答案 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的更多信息。