我需要在 ConcatAdapter 中交换两个适配器,但返回的适配器列表getAdapters()
是不可变的,不会让我使用该java.util.Collections
实用程序。
到目前为止,我尝试将该列表转换为可变列表,交换项目并将列表重新设置,但看起来很难看,因为我在 TouchHelper 的回调中执行此操作。
从源代码复制类并使该列表可变而不可行吗?有没有更好的解决方案?
我需要在 ConcatAdapter 中交换两个适配器,但返回的适配器列表getAdapters()
是不可变的,不会让我使用该java.util.Collections
实用程序。
到目前为止,我尝试将该列表转换为可变列表,交换项目并将列表重新设置,但看起来很难看,因为我在 TouchHelper 的回调中执行此操作。
从源代码复制类并使该列表可变而不可行吗?有没有更好的解决方案?
我试图用反射做一些 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)