获取泛型类加载器来分析嵌套的Parcelable泛型字段 [英] Get generics class loader for parsing nested Parcelable generic field

查看:232
本文介绍了获取泛型类加载器来分析嵌套的Parcelable泛型字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 Parcelable 泛型类型的封装器,但是 Parcel 构造器无法编译,因为 T c> class MyItem< T:Parcelable> class MyItem< T:Parcelable> (val model:T):Parcelable {
constructor(parcel:Parcel):
this(parcel.readParcelable(T :: class.java.classLoader)){

}
}

有没有解决这个问题的方法?



使用案例有一个 Parcelable 泛型实例,我们称它为 model ,它应该使用 Parcelable 封装器,以免污染具有外部字段的模型。例如 Item wrapper。

在下面的例子中,wrapper extra属性为我们提供了一些类型的 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()
){}

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

覆盖fun describeContents():Int {
return 0
}

伴随对象CREATOR:Parcelable.Creator< Item< Parcelable>> {
覆盖fun createFromParcel(parcel:Parcel):Item< Parcelable> {
return Item(parcel)
}

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


$ b $因此,最终我们可以得到类似于: Item(Person(John),0) Item(Person( ()):1) ...

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

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

返回片段
}
}
}

扩展类:

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


I have a wrapper of Parcelable generic type but Parcel constructing fails to compile because T class can not be determined generically

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

    }
}

Is there any solution to this case?

解决方案

In order to get the whole picture here is what I ended up with:

The use case is one has a Parcelable generic instance let's call it model which should be completed with common properties of Parcelable wrapper in order to not pollute the model with extrinsic fields. For example Item wrapper.

In the example below the wrapper extra property gives us some type of 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)
        }
    }
}

So in the end we can have something like: 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
        }
    }
}

extending class like:

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

这篇关于获取泛型类加载器来分析嵌套的Parcelable泛型字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆