Как передать изменяемый список в пакет? - PullRequest
0 голосов
/ 02 июля 2018

Я хочу добавить изменяемый список в пакет, но, кажется, нет способа сделать это.

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

Вы можете использовать putString и так далее, но, похоже, putMutableList не является опцией. Что делать?

UPDATE Забыл упомянуть, что mutableList recipeArray - это object. Как это:

var recipeArray: MutableList<RecipeTemplate>

... где RecipeTemplate - это класс, который выглядит следующим образом:

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

UPDATE Решена проблема согласно ответу @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

}

Передано counter и отображается правильный номер. recipeArray.size передается и показывает правильный номер. Тем не менее, другие журналы recipeArray[1].recipeHeader.toString() и recipeList[1].recipeHeader.toString() имеют нулевое значение, даже если они содержат правильные значения перед помещением в пакет. Есть ли что-то, что мне нужно сделать, чтобы ... eum ... разбор списка? Или я что-то упустил?

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Это зависит от того, какие предметы есть в вашем списке. Bundle имеет несколько методов, которые позволяют вам размещать списки, например, putIntegerArrayList и putStringArrayList. Если вам нужно использовать пользовательский тип, вы можете сделать его Parcelable и использовать putParcelableArrayList.

Конечно, все эти методы в их названии предполагают использование ArrayList экземпляров, а не только MutableList. Таким образом, вы можете либо изменить все свои MutableList использования, чтобы использовать вместо них ArrayList, либо вы можете создать новый ArrayList из вашего существующего MutableList, когда кладете его в комплект:

bundle.putParcelableArrayList("key", ArrayList(myParcelableList))
0 голосов
/ 02 июля 2018

Вы можете сделать

apply plugin: 'kotlin-android-extensions' 

androidExtensions {
    experimental = true
}

Тогда

@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 голосов
/ 02 июля 2018

Какой тип recipeArray? Вы можете поместить различные виды ArrayList (не List!), Включая Integer, CharSequence, Strings и, как правило, Parcelables. См. Документы для полного API: https://developer.android.com/reference/android/os/Bundle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...