【问题标题】:Recyclerview Item Removes and Reappears Immediately When Deleted androidRecyclerview 项目在删除时立即删除并重新出现android
【发布时间】:2021-05-17 05:42:35
【问题描述】:

我正在尝试从回收站视图中删除一个列表。 问题是当我删除项目时, 它会从列表中删除,但会立即重新出现。 (删除方法有效,所以该项目被删除但仍保留在列表中)

适配器

 inner class AllSongsViewHolder(val binding: RcvLytAllSongsBinding) : RecyclerView.ViewHolder(
    binding.root
){
  init {
    binding.icDelete.setOnClickListener {
    onDeleteItemClickListener?.let { click -> click(song, bindingAdapterPosition)}
  }
 }
}

fun removeSongFromList(songList: List<Songs>, position: Int){
    this.songs = songList
    songList.toMutableList().removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, songList.size)
}

片段

..........
private var allSongs: List<Songs>? = null

//THIS IS THE VIEWMODEL FOR GETTING ALL ITEMS STORING IN ADAPTER
mainViewModel.mediaItems.observe(viewLifecycleOwner){ result ->
        when(result.status){
        Status.SUCCESS -> {      
        result.data?.let { songs ->
        allSongsAdapter.songs = sortedBy as List<Songs>
        allSongs = song 
  }

allSongsAdapter.setOnDeleteItemClickListener { songx, position -> 
//delete
val contentResolver: ContentResolver = requireContext().contentResolver
songx.songUri?.let { it1 -> contentResolver.delete(it1, null, null) }
Toast.makeText(context, position.toString(), Toast.LENGTH_LONG).show()
//remove song from list
allSongsAdapter.removeSongFromList(allSongsAdapter.songs, position)

我试图从适配器本身做它,没有工作。

【问题讨论】:

    标签: android android-studio kotlin android-recyclerview


    【解决方案1】:

    好吧,事实上,项目并没有从“原始”数组中删除

    songList.toMutableList().removeAt(position)
    

    toMutableList() 正在返回新的可变数组,您将在其中删除 position 的项目,但永远不要将此可变修改后的数组分配给值,“原始”songList 仍然有这个项目。考虑removeSongFromList body 的这个 sn-p:

    val newList = songList.toMutableList()
    newList.removeAt(position)
    this.songs = newList
    notifyItemRemoved(position)
    

    这里也不需要notifyItemRangeChanged,没有任何变化,只删除了一项

    【讨论】:

    • 这在我停留在同一个片段时有效,但是当我离开片段并返回到同一个片段时(例如通过按下后退按钮),删除的项目会重新出现。
    • 所以我的解决方案适用于您的问题。现在您发现了另一个与不存储当前this.songs 列表有关的问题,它的内容总是被恢复。负责删除项目的代码仅适用于视图和修改(可变)列表,不会从您正在加载初始列表的数据库或 api 中删除项目。你没有发布如何检索这个列表
    • 可能您应该在removeSongFromList 方法中添加更多用于删除列表源(api/数据库)中的数据的代码。关闭 Fragment 并打开它的新实例将加载初始列表,而不会在开始时删除项目(因为它们在那一刻不存在)
    • 其实它是一个音乐应用。 -> 源是从用户手机的所有音乐中获取的,所以在我的片段中(我在适配器中实现了删除方法),我有一个 viewModel 来观察获取所有歌曲并观察歌曲列表的变化。请查看我更新的问题
    • 检查我的问题,我在片段中添加了一条评论 -> “//这是获取适配器中存储的所有项目的视图模型”。这就是我现在删除 allSongsAdapter.removeSongFromList(allSongsAdapter.songs, position) 的方式
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多