实施(网络)搜索 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。
我迷路了。
最近几天,我试图了解在我的 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。