如何将可变列表传递给捆绑包?

How do I pass a mutable list to a bundle?

我想向包中添加一个可变列表,但似乎没有办法实现。

var bundle = Bundle()
                bundle.put...????("LIST", fbModel.recipeArray)

你可以使用putString等等,但是似乎没有putMutableList作为选项。怎么办?

更新 忘记提及 mutableList recipeArray 是一个 object。像这样:

var recipeArray: MutableList<RecipeTemplate>

...其中 RecipeTemplate 是一个 class,看起来像这样:

class RecipeTemplate {
    var recipeHeader: String? = null
    var recipeText: String? = null
    var recipeImage: String? = null
    var recipeKey: String? = null
}

更新 根据@EpicPandaForce 的回答解决了问题:

gridView.setOnItemClickListener { parent, view, position, id ->
                Log.d("TAGA", "CLICKETICLICK " + position)
                Log.d("TAGA", "CLICKETICLICK " + fbModel.recipeArray[1].recipeHeader) //PASSES

                val intent = Intent(classContext, Recipes::class.java)

                var bundle = Bundle().apply {
                    putParcelableArrayList("LIST", ArrayList<Parcelable>(fbModel.recipeArray))
                    putInt("POSITION", position)
                }

                intent.putExtra("bundle", bundle)
                startActivity(intent)
            }

但是我在另一个 activity 中接收它时仍然遇到问题。来自 onCreate 的代码:

var passedIntent = intent.extras
var bundle: Bundle = passedIntent.getBundle("bundle")
var counter: Int = bundle.getInt("POSITION", 0)
var recipeArray: ArrayList<Parcelable> = bundle.getParcelableArrayList("LIST")
var recipeList: MutableList<RecipeTemplate> = recipeArray as MutableList<RecipeTemplate>

Log.d("TAGA", "PASSED " + counter) //PASSES
if(recipeArray != null) {
    Log.d("TAGA", "HERE " + recipeArray[1].recipeHeader.toString()) //Null
    Log.d("TAGA", "HERE " + recipeList[1].recipeHeader.toString()) //Null
    Log.d("TAGA", "HERE " + recipeArray.size) //PASSES

}

counter 通过并显示正确的数字。 recipeArray.size 已通过并显示正确的数字。但是,其他日志 recipeArray[1].recipeHeader.toString()recipeList[1].recipeHeader.toString() 都是空的,即使它们在放入包中之前​​包含正确的值也是如此。有什么我需要做的......嗯......取消解析列表?还是我遗漏了什么?

recipeArray 的类型是什么?您可以放置​​各种类型的 ArrayList(不是 List!),包括 Integers、CharSequences、Strings,最常见的是 Parceables。查看完整的文档 API:https://developer.android.com/reference/android/os/Bundle

这取决于您的列表中有哪些项目。 Bundle 有几个方法可以让您在其中放置列表,例如 putIntegerArrayList and putStringArrayList. If you need to use a custom type, you can make it Parcelable and use putParcelableArrayList.

当然,所有这些方法,正如它们的名字所暗示的那样,具体采用 ArrayList 个实例,而不仅仅是任何 MutableList 个实例。因此,您可以将所有 MutableList 用法更改为使用 ArrayList,或者您可以在将现有 MutableList 放入捆绑包时从现有 ArrayList 创建一个新的 ArrayList :

bundle.putParcelableArrayList("key", ArrayList(myParcelableList))

你可以做到

//apply plugin: 'kotlin-android-extensions' 

//androidExtensions {
//    experimental = true
//}

apply plugin: 'kotlin-parcelize'

然后

@Parcelize
class RecipeTemplate : Parcelable {
    var recipeHeader: String? = null
    var recipeText: String? = null
    var recipeImage: String? = null
    var recipeKey: String? = null
}

然后

var bundle = Bundle().apply {
                  putParcelableArrayList("LIST", ArrayList<Parcelable>(fbModel.recipeArray))
             }