如何解决RecyclerView中的滚动定位问题

时间:2020-07-27 18:00:38

标签: android kotlin android-recyclerview

例如,当用户选择“按标题”时,我的应用程序中就具有setOrder功能,它将查询本地数据库,并返回按标题排序的列表。

功能正常,当我单击setOrder时,它将带我到排序列表的顶部。

当我在列表的底部时,它可以按预期工作,但是如果我在列表的顶部,然后单击setOrder,则它只是在列表中的前一个项目之后。

我认为问题出在哪里?

当第一个项目出现在视图中时,它仍然保留对该项目的引用,因此它将“跟随”该项目到他的新位置。

为了解决这个问题,我尝试了几件事,但没有一个奏效。

代码:

我在用户选择订单时调用此功能

        onMovieFilter()

在此函数中,我进行本地数据库调用并调用resetRecycler()

private fun resetRecycler() {
    movies_recycler_view.smoothScrollToPosition(0)
}

顺便说一句,即使我没有打电话,我仍然会出现这种情况

movies_recycler_view.smoothScrollToPosition(0)

适配器代码

class MoviesRecyclerViewAdapter() :
    ListAdapter<Movie, MoviesRecyclerViewAdapter.MoviesViewHolder>(
        DiffUtilCallBack()
    ) {

    private var listRef: List<Movie> = ArrayList()
    


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MoviesViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.movie_item, parent, false)
        return MoviesViewHolder(view)
    }

    override fun onBindViewHolder(holder: MoviesViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(item)
    }
    

    class MoviesViewHolder(itemView: View) :
        RecyclerView.ViewHolder(itemView) {
        private var movieImage = itemView.movie_image
        private var movieTitleText = itemView.movie_title_text




        fun bind(item: Movie?) {
            item?.let { movie ->
                movieTitleText.text = movie.title

                val currentUrl = "https://image.tmdb.org/t/p/w400${movie.posterPath}"

                Glide.with(itemView.context)
                    .load(currentUrl)
                    .apply(RequestOptions.overrideOf(400, 600))
                    .placeholder(R.drawable.ic_launcher_background)
                    .error(R.drawable.ic_launcher_foreground)
                    .into(movieImage)
            }
        }
        

    }

}



class DiffUtilCallBack : DiffUtil.ItemCallback<Movie>() {
    override fun areItemsTheSame(oldItem: Movie, newItem: Movie): Boolean {
        return oldItem.title == newItem.title
    }

    override fun areContentsTheSame(oldItem: Movie, newItem: Movie): Boolean {
        return oldItem == newItem
    }
}

0 个答案:

没有答案