drakeet / MultiType

Flexible multiple types for Android RecyclerView.
Apache License 2.0
5.76k stars 751 forks source link

请教 kotlin 使用 adapter.items.add() 的语法问题 #227

Closed Bakumon closed 6 years ago

Bakumon commented 6 years ago

感谢作者开源如此优秀的库,我在 kotlin 使用遇到了一个语法问题,希望能指点一下。 给 adapter 添加一条数据,想当然地这样操作:

adapter.items.add("text")

但是,报了如下编译错误:

Out-projected type '(Mutable)List<*>' prohibits the use of 'public abstract fun add(element: E):Boolean defined in kotlin.collections.MutableList'

于是尝试这样写:

val  items = adapter.items as MutableList<String>
items.add("test")

可以正确运行,但是还是会报转换警告⚠️

unchecked cast: (Mutable)List<*> to MutableList<String>

每次添加数据都需要这样写吗,有没有优雅的写法?

linzhengloser commented 6 years ago

我一直都是这么用的。

val mItems = Items()
val mAapter = MultiTypeAdapter().apply{ items = mItems }
mItems.add("123")

Kotlin 里面的 list 比较蛋疼。默认 List 类型是不可变的。

drakeet commented 6 years ago

@linzhengloser 做法是推荐的。 Kotlin 的行为也是正确的。你传递给 MultiTypeAdapter 的是不可变的 list,如果你需要修改内容,需要 adapter.items.toMutableList() 或 set items 时使用可变 list。