在回收站视图android中滚动时,项目会重新添加到复选框中
Posted
技术标签:
【中文标题】在回收站视图android中滚动时,项目会重新添加到复选框中【英文标题】:Items get re-added in checkbox while scrolling in recycler view android 【发布时间】:2021-08-11 12:06:20 【问题描述】:我在 RecyclerView 中有一个包含复选框的项目列表,我试图从我的adapter
到我的fragment
获取复选框中的选定项目。
问题
每次我滚动到项目的位置时都会重新添加项目。
例如-
当我检查一个项目时,它会被添加到我的选定项目列表中 - 很好。 但是当我向下滚动并向上滚动时,该项目会再次添加。滚动时会一遍又一遍地发生同样的事情。
适配器
var checkedSongs = ArrayList<Songs>()
var checkBoxStateArray = SparseBooleanArray()
inner class SelectSongsViewHolder(val binding: RcvLytSelectSongsBinding) :
RecyclerView.ViewHolder(
binding.root)
init
binding.checkbox.setOnCheckedChangeListener buttonView, isChecked ->
if (isChecked)
val song = songs[absoluteAdapterPosition]
checkedSongs.add(song)
else
val song = songs[absoluteAdapterPosition]
checkedSongs.remove(song)
checkBoxStateArray.put(bindingAdapterPosition, isChecked)
.......
//In onBindViewHolder
binding.checkbox.isChecked = checkBoxStateArray.get(position, false)
//Function to get all checked songs
fun getSelectedSongs(): ArrayList<Songs>
return checkedSongs
片段
binding.txtDone.setOnClickListener
val selectedRows = selectSongsAdapter.getSelectedSongs()
Toast.makeText(requireContext(), selectedRows.toString(), Toast.LENGTH_LONG).show()
假设我在列表中有 5 个项目
1。 2. 3. 4. 5.
当我检查第 1 项并单击完成时...Toast message = "[Item(item1)]"
当我向下滚动和向上滚动时.....Toast message = "[Item(item1), Item(item1)]"
...就这样一直持续下去。
【问题讨论】:
您可以通过在 recycler 的 set layout manager 下方添加这一行来禁用回收过程。recyclerView.recycledViewPool.setMaxRecycledViews(0,0)
这将破坏 recyclerview 的目的,并且复选框不是按说的回收。它是滚动时重复的选定项目
【参考方案1】:
只需检查您的 ArrayList 是否包含该对象。由于您使用的是 Kotlin,如果您的 Songs
模型类包含每首歌曲的任何唯一标识符,例如 objectId 或其他东西,您可以使用简单的东西,例如谓词:
val checkSongExist = checkedSongs.any it.id == song.id
if (!checkSongExist)
// write your code here to add items to array
【讨论】:
我试过了,但它返回一个空列表...没有添加任何内容。 if (isChecked) val song = song[absoluteAdapterPosition] checkedSongs.find listItem -> if (listItem.mediaId != song.mediaId) checkedSongs.add(song) else false 您可以删除条件,只检查歌曲 ID 是否存在于该列表中,如果返回一个空列表,则表示该歌曲不存在,您可以在之后使用您的代码添加它。同样,如果您没有得到空列表,则表示该歌曲存在,在这种情况下,请不要添加该歌曲。那应该可以。 请您修改您的答案(代码),谢谢 未解决的参考:“!”不能用! (不等于运算符) 检查最新的编辑,使用any
,它会根据你的谓词是否匹配给你一个布尔值。你可以使用一个简单的 if 条件。以上是关于在回收站视图android中滚动时,项目会重新添加到复选框中的主要内容,如果未能解决你的问题,请参考以下文章
使用Android ViewPager2在回收器视图中滚动到底部时自动更改选项卡项