在回收站视图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在回收器视图中滚动到底部时自动更改选项卡项

在 Android 回收站视图中重新排序项目后,位置未更新

滚动回收站视图时如何防止项目重复

在回收站视图中滚动时,它向选定的复选框列表添加了一些其他值

在顶部添加新项目后,回收器视图未滚动到顶部,因为尚未发生对列表适配器的更改

每次重新创建滚动位置后,如何将滚动位置保存在回收站视图中?