我在Github中有以下项目:https://github.com/Ali-Rezaei/News-Cache
首先,我在Fragment中加载数据,从数据库中显示数据,然后开始从API加载数据。从API加载完成后,我将更新数据库,并且Fragment中的recyclerView也将更新。
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.news.observe(viewLifecycleOwner, Observer<List<Article>> { articles ->
articles?.apply {
viewModelAdapter.submitList(articles)
}
})
}
这是我的适配器:
class NewsAdapter(val callback: OnClickListener) : ListAdapter<Article, NewsAdapter.NewsViewHolder>(DiffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = NewsViewHolder.from(parent)
override fun onBindViewHolder(holder: NewsViewHolder, position: Int) {
holder.bind(getItem(position), callback)
}
/**
* Allows the RecyclerView to determine which items have changed when the [List] of [Article]
* has been updated.
*/
companion object DiffCallback : DiffUtil.ItemCallback<Article>() {
override fun areItemsTheSame(oldItem: Article, newItem: Article): Boolean {
return oldItem.url == newItem.url
}
override fun areContentsTheSame(oldItem: Article, newItem: Article): Boolean {
return oldItem == newItem
}
}
}
当新数据从API到达时,我想滚动到RecyclerView的顶部:
handler.postDelayed({
binding.recyclerView.scrollToPosition(0)
}, 1000)
问题是当我进入“详细信息”屏幕并导航回主屏幕onActivityCreated
和onCreateView
时被调用,结果binding.recyclerView.scrollToPosition(0)
也被调用,这不是我所需要的想要。
从API收到新数据时,滚动到RecyclerView顶部的解决方案是什么?
答案 0 :(得分:0)
您可以通过持有将作为指标的布尔变量来轻松解决此问题。isFirstLoad
在开始观察新闻之前,在onActivityCreated中将其设置为true,然后在观察者内部设置您要执行的操作。
类似的方法应该起作用:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
isFirstNewsFetch = true
viewModel.news.observe(viewLifecycleOwner, Observer<List<Article>> { articles ->
articles?.let { articles ->
viewModelAdapter.submitList(articles)
if(isFirstNewsFetch) {
isFirstNewsFetch = false
}else {
scrollToTop()
}
}
})
}
作为旁注:
apply
标准功能/作用域功能应用于对象配置。
为您的目的使用let
-
Kotlin standard functions cheat sheet