Recycler View 显示相同的项目
Recycler View shows identical items
我有一个字符串 arrayList<>,我向其中添加了 10 个字符串。
private val names: ArrayList<String> = arrayListOf()
这些是添加的字符串
[G.I. Joe: The Rise of Cobra, Creed 2, The Equalizer 2, Ride Along 2, Mission Impossible, Mission Impossible II, Mission Impossible III, Mission Impossible: Ghost Protocol, Mission Impossible: Fallout, Suicide Squad]
我有一个回收站视图及其适配器,如下所示:
class MovieSeriesAdapter(
private val movie: MoviesInSeries,
private val movieNameList: ArrayList<String>?,
private val restMoviesPosition: Int,
): RecyclerView.Adapter<MovieSeriesAdapter.ViewHolder>() {
class ViewHolder(binding: SeriesMoviesItemBinding): RecyclerView.ViewHolder(binding.root) {
val mainThing = binding.mainThing
val tvMovieNameAndYear = binding.seriesMovieNameAndYear
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(SeriesMoviesItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (position % 2 != 0) {
holder.mainThing.setBackgroundColor(Color.parseColor("#E8E8E8"))
}
val RestMoviesList = Constants.getRestOfSeriesMovies()
var targetPosition: Int = 0
when (movie.originalMovieName) {
"G.I. Joe: Retaliation" -> targetPosition = 0
"Creed" -> targetPosition = 1
"The Equalizer" -> targetPosition = 2
"Ride Along" -> targetPosition = 3
"Mission Impossible" -> targetPosition = 4
"Suicide Squad" -> targetPosition = 9
"Venom" -> targetPosition = 10
}
val targetMovieName = movieNameList!![targetPosition]
holder.tvMovieNameAndYear.text = "$targetMovieName ($targetMovieDate)"
}
override fun getItemCount(): Int {
return 5
}
问题是有时我需要回收站视图显示 5 个项目,如下例所示。例如,我有 5 部不可能完成任务的电影,我想放映它们。但是 targetPosition
是一个只有一个数字的整数变量。
我尝试创建一个仅包含不可能完成任务的电影的数组列表,但它显示了相同的 5 个项目,其中一个项目的所有数据。
我如何做到当我需要显示 5 个项目时,每个项目都应该从名称数组列表中获得不同的值。
我建议你在设置text的值时直接使用onBindViewHolder中targetValue的position值。
您应该只向适配器提供您要显示的 5 个列表。
另外,你写的很多代码都没有多大意义。
例如
when (movie.originalMovieName) {
你在这里根据 movie.originalMovieName 决定了一些东西,但是这个 movie
是在适配器的构造函数中传递的,这已经没有意义了,但这也意味着它将是每个项目都是同一部电影。
我有一个字符串 arrayList<>,我向其中添加了 10 个字符串。
private val names: ArrayList<String> = arrayListOf()
这些是添加的字符串
[G.I. Joe: The Rise of Cobra, Creed 2, The Equalizer 2, Ride Along 2, Mission Impossible, Mission Impossible II, Mission Impossible III, Mission Impossible: Ghost Protocol, Mission Impossible: Fallout, Suicide Squad]
我有一个回收站视图及其适配器,如下所示:
class MovieSeriesAdapter(
private val movie: MoviesInSeries,
private val movieNameList: ArrayList<String>?,
private val restMoviesPosition: Int,
): RecyclerView.Adapter<MovieSeriesAdapter.ViewHolder>() {
class ViewHolder(binding: SeriesMoviesItemBinding): RecyclerView.ViewHolder(binding.root) {
val mainThing = binding.mainThing
val tvMovieNameAndYear = binding.seriesMovieNameAndYear
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(SeriesMoviesItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (position % 2 != 0) {
holder.mainThing.setBackgroundColor(Color.parseColor("#E8E8E8"))
}
val RestMoviesList = Constants.getRestOfSeriesMovies()
var targetPosition: Int = 0
when (movie.originalMovieName) {
"G.I. Joe: Retaliation" -> targetPosition = 0
"Creed" -> targetPosition = 1
"The Equalizer" -> targetPosition = 2
"Ride Along" -> targetPosition = 3
"Mission Impossible" -> targetPosition = 4
"Suicide Squad" -> targetPosition = 9
"Venom" -> targetPosition = 10
}
val targetMovieName = movieNameList!![targetPosition]
holder.tvMovieNameAndYear.text = "$targetMovieName ($targetMovieDate)"
}
override fun getItemCount(): Int {
return 5
}
问题是有时我需要回收站视图显示 5 个项目,如下例所示。例如,我有 5 部不可能完成任务的电影,我想放映它们。但是 targetPosition
是一个只有一个数字的整数变量。
我尝试创建一个仅包含不可能完成任务的电影的数组列表,但它显示了相同的 5 个项目,其中一个项目的所有数据。
我如何做到当我需要显示 5 个项目时,每个项目都应该从名称数组列表中获得不同的值。
我建议你在设置text的值时直接使用onBindViewHolder中targetValue的position值。
您应该只向适配器提供您要显示的 5 个列表。
另外,你写的很多代码都没有多大意义。
例如
when (movie.originalMovieName) {
你在这里根据 movie.originalMovieName 决定了一些东西,但是这个 movie
是在适配器的构造函数中传递的,这已经没有意义了,但这也意味着它将是每个项目都是同一部电影。