java.lang.IllegalStateException:两个不同的ViewHolder具有相同的稳定ID。适配器中的稳定 ID 必须是唯一的且不应更改

问题描述 投票:0回答:1

我正在开发音乐应用程序,它的歌曲队列包含不同状态的重复歌曲(根据用户要求重复歌曲),其中一首可能处于播放状态,其他则不是(screenshot)。

我已将

setHasStableIds(true)
设置为适配器并实现
getItemId
,如下所示:

 override fun getItemId(position: Int): Long {
    return dataset[position].songId.hashCode().toLong()
}

我也尝试过如下扩展

Song
,我认为这不是个好主意?

data class QueueSong(private val song: Song) : Song(song) {
   val queueId: Int = hashCode()
}

请大家帮忙解决一下,谢谢!!

android kotlin android-recyclerview
1个回答
0
投票
    如果
  1. getItemId()

    ,则

    setHasStableIds(true)
    必须为每个项目返回唯一的结果。

  2. 如果根据

    equals()
    方法,两个对象相等,则对这两个对象调用
    hashCode()
    方法必须产生相同的整数结果。

重复的歌曲具有相同的

songId
,因此您执行
getItemId()
将返回相同的结果。

data class QueueSong
val queueId: Int = hashCode()
也不起作用,因为 Kotlin 会自动为该类生成
equals()
hashCode()
。具有相同
QueueSong
的重复
Song
将产生相同的哈希码。

您应该使用

queueId
之类的东西生成一个唯一的
UUID.randomUUID().toString()
,以确保它们具有唯一的哈希码。

© www.soinside.com 2019 - 2024. All rights reserved.