android - 导航离开后返回片段时如何恢复先前的滚动位置
问题描述
我在 Github 有以下项目:https ://github.com/AliRezaeiii/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 顶部的解决方案是什么?
解决方案
你可以很容易地解决这个问题,方法是按住 bool 作为指标。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 标准函数备忘单
推荐阅读
- jquery - 无法使用 Angular 获取列值的动态总和
- javascript - 如何禁用向上和向下箭头键
- azure-data-factory - 具有 787 个表(sql server)的 adf v2 复制数据工具仅在管道参数 json 中创建具有 340 的管道。为什么?
- php - 生成模板失败:找不到 TrueType 字体文件
- prometheus - 如何在 PrometheusMiddlewar 中获取请求正文
- java - 字符串“”上的 Hadoop NumberFormatException
- docker - 如何从具有给定名称的图像启动 docker 容器?
- python - 如何在轴的顶部水平显示 xlsxwriter 柱形图的 y_axis 名称?
- mysql - 创建 SQL 桥表
- javascript - “member.user.tag”标签未定义