例如,当用户选择“按标题”时,我的应用程序中就具有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
}
}