gpt4 book ai didi

android - 在 fragment 中更新 RecyclerView 时的 scrollToPosition()

转载 作者:行者123 更新时间:2023-12-02 13:29:49 27 4
gpt4 key购买 nike

我制作了一个列表,它使用 LiveData 从房间数据库中获取项目。 .这个liveData<List>然后绑定(bind)到 recyclerView , 使用 BindingAdapter .
列表适配器是 listAdapter ,而不是`RecyclerView.Adapter。

我需要帮助保持滚动状态或以某种方式返回到 recyclerView 之前的滚动索引重新加载:

//In ViewModel
val movieList = moviesRepository.movies

..
//in Repo
val movies: LiveData<List<Movie>> =
Transformations.map(database.movieDao.getMovies()) {
it.asDomainModel()
}

每次数据库更新时, recyclerView射回顶部。

这是 bindingAdapter对于 RecyclerView和 list 。
@BindingAdapter("listData")
fun bindRecyclerView(recyclerView: RecyclerView, data: List<Movie>?) {
val adapter = recyclerView.adapter as MovieListAdapter
//Log.d("listData binding", "${data}")
adapter.submitList(data)
}

我想我需要使用 recyclerView.smoothScrollToPosition(la.getItemCount()); 之类的东西
更新发生后,但我不知道如何在更新发生时自动调用它

Project Repo

最佳答案

  • 首先不要使用ListAdapter RecyclerView有一个更优化的适配器here
  • 在您的适配器中提供一个覆盖项目列表的函数 并在此处通知数据更改
  • 使用smoothScrollToPosition(lastVisiblePosition)滚动到 lastVisiblePosition = layoutManager.findFirstVisibleItemPosition() 的最后一个可见位置
  • 更新 lastVisiblePosition在将新项目推送到适配器之前 notifyDatasetChanged()

  • 第二步
    fun updateList(newItems:List<Movie>) {
    moviesList.addAll(newItems)
    lastVisiblePosition = layoutManager.findFirstVisibleItemPosition()
    notifyDataSetChanged()
    }

    当您调用 adapter.updateList(newItems) 时,您会看到只需调用 recyclerView.smoothScrollToPosition(adapter.lastVisiblePosition)

    关于android - 在 fragment 中更新 RecyclerView 时的 scrollToPosition(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62094935/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com