Android Kotlin : putParcelableArrayList(ArrayList<int>) and getParcelableArrayList<Int>() wont work

标签 android arraylist kotlin parcelable

我正在尝试通过ArrayList<Integer>从 fragment 到另一个 fragment ,这是我的代码:

Kotlin 代码

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
    }
}

但它说:

Type mismatch.

Required: java.util.ArrayList !

Found: kotlin.collections.ArrayList /* = java.util.ArrayList */

当我尝试阅读它时,也是同样的情况。

Kotlin 代码

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

它说:

Type argument is not within its bounds

Expected: Parcelable!

Found: Int

我已经用 Java 对其进行了测试并且工作正常。

最佳答案

您可以创建一个包含类型 (Any) 变量的通用 Parcelable 类

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)
        }
    }
}

然后使用这个类在Fragment之间或者(Activty到Fragment)之间传递数据

例如,将列表从 fragment 传递到 fragment :

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>

关于Android Kotlin : putParcelableArrayList(ArrayList<int>) and getParcelableArrayList<Int>() wont work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51331659/

相关文章:

spring-boot - 使用Kotlin和Gradle时如何将额外的spring-configuration-metadata.json与kapt合并?

android - 由于 android.widget.BubblePopupHelper 导致的内存泄漏

android - 如何在 Constraint Layout 内将两个 TextView 居中放置?

java - 更改可见性导致我的应用程序崩溃,为什么?

java - 从 ArrayList 中删除对象(帐户)

java - 将元素添加到 Arraylist 并替换 Java 中的所有先前元素

java - 从 Json 获取字符串而不出现 OutOfMemoryError

用于参数化类型的 Java 迭代器

android - Kotlin : Not able to call interface method with inheritance

javafx - Kotlin中尚未使用TestFX初始化lateinit属性xxx