android - 获取用于解析嵌套的 Parcelable 泛型字段的泛型类加载器

标签 android generics kotlin parcelable

我有一个 Parcelable 通用类型的包装器,但是 Parcel 构造编译失败,因为 T 类不能被通用地确定

class MyItem<T : Parcelable> (val model: T) : Parcelable {
    constructor(parcel: Parcel) : 
      this(parcel.readParcelable(T::class.java.classLoader)) {

    }
}

这种情况有什么解决办法吗?

最佳答案

为了得到全貌,我最终得到的是:

用例是一个有一个 Parcelable 通用实例的,我们称它为 model ,它应该按顺序用 Parcelable 包装器的公共(public)属性完成不要用外部场污染模型。例如 Item 包装器。

在下面的示例中,包装器额外属性为我们提供了某种类型的 index :

class Item<T : Parcelable> (val model: T, val index: Int ) : Parcelable {

    constructor(parcel: Parcel) :
        this(parcel.readParcelable(
          Item<T>::model.javaClass.classLoader),
          parcel.readInt()
        ) {}

    override fun writeToParcel(parcel: Parcel?, flag: Int) {
        parcel?.writeParcelable(model, 0)
        parcel?.writeInt(index)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Item<Parcelable>> {
        override fun createFromParcel(parcel: Parcel): Item<Parcelable> {
            return Item(parcel)
        }

        override fun newArray(size: Int): Array<Item<Parcelable>?> {
            return arrayOfNulls(size)
        }
    }
}

所以最后我们可以得到类似的东西:Item(Person("John"), 0), Item(Person("Bill"), 1) ...

class PersonPagerFragment() : BasePagerFragment<Person>() {
    companion object {
        fun newInstance(itemList: ArrayList<Item<Person>>) 
          : PersonPagerFragment {

            val args = Bundle()
            val fragment = PersonPagerFragment()
            args.putParcelableArrayList("items", itemList)
            fragment.arguments = args

            return fragment
        }
    }
}

像这样扩展类:

class BasePagerFragment<T : Parcelable> : Fragment(){
    protected fun readBundle(bundle: Bundle?) {
        bundle.getParcelableArrayList<Item<T>>("items")    
    }
}

关于android - 获取用于解析嵌套的 Parcelable 泛型字段的泛型类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47896351/

相关文章:

android - 如何制作一个 GridLayout,其中元素平均填充网格?

Java 和泛型

generics - TypeScript 中是否可以使用泛型类型别名?

kotlin - TypeConverters 无法弄清楚如何将此字段保存到数据库中

kotlin - Android Room 中的 AppDatabase 可以随时为空吗?

android - 来自 URL 的 CSS 在 JSoup 中不起作用

android - 在 Android 中以编程方式使用屏幕截图时保存空白文件

java - 无法更改 Android Activity

c# - 无法从用法中推断出类型参数

android - 当我将代码从 Java 转换为 Kotlin 时出现错误 "Expecting member declaration",为什么?