0

我需要在 ConcatAdapter 中交换两个适配器,但返回的适配器列表getAdapters()是不可变的,不会让我使用该java.util.Collections实用程序。

到目前为止,我尝试将该列表转换为可变列表,交换项目并将列表重新设置,但看起来很难看,因为我在 TouchHelper 的回调中执行此操作。

从源代码复制类并使该列表可变而不可行吗?有没有更好的解决方案?

4

1 回答 1

0

我试图用反射做一些 hacky 的东西,ConcatAdapter 类不包含对底层适配器的引用,但是有一个 ConcatAdapterController 字段(哪个类是私有的),它有一个mWrappers基本上是由返回的字段getAdapters()

无论如何,这是我使用过的代码,它工作正常

val controllerClass = Class.forName("androidx.recyclerview.widget.ConcatAdapterController")
    val controllerField = ConcatAdapter::class.java.declaredFields.find { it.name == "mController" }?.apply {
        this.isAccessible = true
    }
    val controller = controllerField?.get(this)
    val wrappersField = controllerClass.declaredFields.find { it.name == "mWrappers"}?.apply {
        this.isAccessible = true
    }
    val wrappers = wrappersField?.get(controller) as List<*>

    Collections.swap(wrappers, from, to)

    notifyItemMoved(from, to)
于 2021-10-14T18:57:44.807 回答