导航后返回片段时如何恢复上一个滚动位置

时间:2019-08-28 18:01:13

标签: android android-recyclerview

我在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)

问题是当我进入“详细信息”屏幕并导航回主屏幕onActivityCreatedonCreateView时被调用,结果binding.recyclerView.scrollToPosition(0)也被调用,这不是我所需要的想要。

从API收到新数据时,滚动到RecyclerView顶部的解决方案是什么?

1 个答案:

答案 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