Android Kotlin:putParcelableArrayList(ArrayList <int>)和getParcelableArrayList <int>()无法正常工作

时间:2018-07-13 19:25:43

标签: android arraylist kotlin parcelable

我正在尝试将ArrayList<Integer>从片段传递到另一个片段,这是我的代码:

科林代码

companion object {
    fun newInstance(categoryId: Int, brandsList: ArrayList<Int>): Fragment {
        val fragment = CategoryAllAdsFragment()
        fragment.arguments = Bundle()
        fragment.arguments!!.putInt(Constant.CATEGORY_ID, categoryId)
        fragment.arguments!!.putParcelableArrayList(Constant.BRANDS_LIST, brandsList)
        return fragment
    }
}

但它说:

  

类型不匹配。

     

必需:java.util.ArrayList!

     

找到:kotlin.collections.ArrayList / * = java.util.ArrayList * /

当我尝试阅读时,也是一样。

科林代码

try {
    val brandsList = arguments!!.getParcelableArrayList<Int>(Constant.BRANDS_LIST)
} catch (ex: Exception) {
    throw Exception("brand list cannot be null")
}

它说:

  

类型参数不在其范围内

     

预期:可包裹!

     

找到了:Int

我已经用Java测试了它,并且效果很好。

2 个答案:

答案 0 :(得分:4)

您可以创建一个普通的Parcelable类,其中包含类型为(Any)的变量

class BaseParcelable : Parcelable {

    var value: Any

    constructor(value: Any) {
        this.value = value
    }

    constructor(parcel: Parcel) {
        this.value = Any()
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {}

    override fun describeContents(): Int = 0

    companion object CREATOR : Parcelable.Creator<BaseParcelable> {

        override fun createFromParcel(parcel: Parcel): BaseParcelable {
            return BaseParcelable(parcel)
        }

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

}

然后使用此类在片段之间或片段之间(活动到片段)之间传递数据

例如,将列表从片段传递到片段:

companion object {
    fun newInstance(categoryId: Int, brandsList: ArrayList<Int>): Fragment {
       val fragment = CategoryAllAdsFragment()
       fragment.arguments = Bundle()
       fragment.arguments!!.putInt(Constant.CATEGORY_ID, categoryId)
       fragment.arguments!!.putParcelable(Constant.BRANDS_LIST, BaseParcelable(brandsList))
       return fragment
    }

}

要获取列表:

val any = arguments?.getParcelable<BaseParcelable>(Constant.BRANDS_LIST).value
val list = any as ArrayList<Int>

答案 1 :(得分:2)

使用

  
      
  • putIntegerArrayList(字符串键,ArrayList值)

  •   
  • 将ArrayList值插入此Bundle的映射中,替换任何   给定键的现有值

  •   
putIntegerArrayList(Constant.BRANDS_LIST, array)

变得像

  
      
  • getIntegerArrayList(String key)

  •   
  • 返回与给定键关联的值;如果没有映射,则返回null   对于给定的键,存在所需类型的,或者为null值   明确与该键相关联。

  •   
extras.getIntegerArrayList(Constant.BRANDS_LIST)