如何将可变列表传递给捆绑包?
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))
}
我想向包中添加一个可变列表,但似乎没有办法实现。
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))
}