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

How do I pass a mutable list to a bundle?

提问人:tore 提问时间:7/2/2018 最后编辑:tore 更新时间:2/15/2021 访问量:12648

问:

我想将可变列表添加到捆绑包中,但似乎没有办法做到这一点。

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

您可以使用等等,但似乎没有作为选项。该怎么办?putStringputMutableList

更新忘了提到 recipeArray 是一个 .喜欢这个:mutableListobject

var recipeArray: MutableList<RecipeTemplate>

...其中 RecipeTemplate 是一个如下所示的类:

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

但我在其他活动中仍然无法接收它。此处的代码来自 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

}

传递并显示正确的数字。传递并显示正确的数字。但是,其他日志 和 都是 null,即使它们在放入捆绑包之前包含正确的值。我需要做些什么吗?嗯...解析列表?还是我错过了什么?counterrecipeArray.sizerecipeArray[1].recipeHeader.toString()recipeList[1].recipeHeader.toString()

人造人 列表 科特林 可变

评论

0赞 EpicPandaForce 7/2/2018
RecipeTemplate is a class.可能想要更具体
0赞 tore 7/2/2018
好的,更新了班级信息:)

答:

0赞 AutonomousApps 7/2/2018 #1

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

6赞 zsmb13 7/2/2018 #2

这取决于您的列表中有哪些项目。 有几个方法允许您在其中放置列表,例如 putIntegerArrayListputStringArrayList。如果需要使用自定义类型,可以创建并使用 putParcelableArrayListBundleParcelable

当然,顾名思义,所有这些方法都专门考虑实例,而不仅仅是任何.因此,您可以更改要使用的所有用法,也可以在将其放入捆绑包时从现有用法中创建一个新的用法:ArrayListMutableListMutableListArrayListArrayListMutableList

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

评论

0赞 tore 7/2/2018
忘了提到数据类型是一个对象,见上文。您能详细说明一下可包裹的部分吗?
1赞 Marko Topolnik 7/2/2018
使用@Parcelize
16赞 EpicPandaForce 7/2/2018 #3

你可以做

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

评论

0赞 tore 7/2/2018
谢谢,这似乎奏效了。我还在上面添加了以消除错误。现在唯一的问题是在从捆绑包中解包时将其恢复到原始状态,对吧?我似乎不能在新活动中使用它......@SuppressLint("ParcelCreator")@Parcelize
0赞 EpicPandaForce 7/2/2018
使用:pgetParcelableArrayList<RecipeTemplate>("LIST")
0赞 tore 7/2/2018
我已经更新了我的帖子,以更详细地解释我的意思:)不过,非常感谢您的帮助!:)
0赞 EpicPandaForce 7/2/2018
尝试像我的评论中一样指定模板参数
0赞 tore 7/2/2018
同样不幸的是:/零