web-dev-qa-db-fra.com

Obtenir une liste matricielle sérialisable sur le fragment d'intention

Sur mon fragment, je veux obtenir ArrayList<Animal>. J'ai créé une fonction newInstance.

  companion object {
    private val ARG_TITLE = "ARG_TITLE"
    private val ARG_ANIMALS = "ARG_ANIMALS"

    fun newInstance(title: String,animals: ArrayList<Animal>): ExampleFragment{
        val fragment = ExampleFragment()
        val args = Bundle()
        args.putString(ARG_TITLE, title)
        args.putSerializable(ARG_ANIMALS, animals)
        fragment.arguments = args
        return fragment
    }
}

Et sur mon onCreate() j'ai ceci.

 private var title: String = ""
lateinit private var animals:ArrayList<Animal>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (arguments != null) {
        title = arguments.getString(ARG_TITLE)
        animals = arguments.getSerializable(ARG_ANIMALS)
    }
}

Mais 

Obligatoire: ArrayList trouvé Serialized!

Ne peut pas non plus faire appel à ArrayList.

12
Aris Guimerá

Comme mentionné dans un commentaire, lancez-le:

REMARQUE: le transtypage en Serializable n'est pas nécessaire s'il s'agit d'un ArrayList (cela signifie que ArrayList - List et MutableList sont affectés différemment). List et MutableList doivent être convertis en Serializable (sinon, l'erreur "types incompatibles")

args.putSerializable(ARG_ANIMALS, animals as Serializable) //This is to cast it to the appropriate form in order for it to be serialized properly

et le refléter sur la sortie:

Casting ici est nécessaire, peu importe quoi. Sinon, vous aurez juste un Serializable et pas la classe que vous avez sérialisée.

animals = arguments.getSerializable(ARG_ANIMALS) as ArrayList<Animal>

Le type doit être spécifié dans le losange, sinon vous obtenez une erreur car animals: ArrayList<Animal> ne correspond pas ArrayList<*>

Vous voudrez peut-être envisager d'utiliser List plutôt que ArrayList pour généraliser les types que vous acceptez (inclure MutableList pour une instance).

Et cela ne fonctionne que si Animal implémente Serializable. Sinon, il va planter lorsque vous mettez/obtenez la liste du paquet. Les listes ne sont sérialisables que si la classe qu'elles contiennent l'est également.

9
Zoe

Obtenir ArrayList sur le fragment d'intention est effectué avec cette ligne de code . Et ce code fonctionne pour les types ArrayList Serializable et non Serializable.

//first add this dependency in app build.gradle file
compile 'com.google.code.gson:gson:2.8.0'


//to send the arraylist contains elements of object type.
ArrayList<Object> mOrderList=new ArrayList();
//suppose this list now contains some data like number of objects.
Fragment fragment new YourFragment();
Bundle bundle=new Bundle();
Gson gson = new Gson();
String jsonDetails = gson.toJson(mOrderList);
bundle.putString(IntentKeyConstants.TAG_ORDER_LIST, jsonDetails);
fragment.setArguments(bundle);
FragmentTransaction fragmentTransaction=getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment, CURRENT_TAG);
fragmentTransaction.addToBackStack(CURRENT_TAG);
fragmentTransaction.commit();


//to get the arraylist contains the element of object type in fragment
ArrayList<Object> mOrderList=new ArrayList();
Gson gson=new Gson();
String jsonDetails;  
jsonDetails=getArguments().getString(IntentKeyConstants.TAG_ORDER_LIST);
Type type=new TypeToken<ArrayList<SuggestionResponseBean>>(){}.getType();
mOrderList=gson.fromJson(jsonDetails,type);

J'espère que cette solution vous aidera . Merci

1
Aman Goyal

Vous devez faire en sorte que votre classe Animal implémente Serializable et utilisez le code ci-dessous pour définir les données dans le bundle

args.putSerializable(ARG_ANIMALS, animals)

Afin d'obtenir les données dans un autre fragment comme ci-dessous

animals = arguments.getSerializable(ARG_ANIMALS)
0
Shivam Sharma