En passant JSONObject dans une autre activité
Je suis frapper une API externe que de renvoyer des données JSON (nouveaux titres de dvd). Je suis capable de parser le JSON et de la liste de chaque titre de dvd et d'autres dvd de l'information dans un ListView l'amende juste. J'ai aussi été en mesure de configurer un onListItemClick méthode très bien pour la primitive de données (chaîne de titre). J'ai fini par écrire quelque chose comme ça pour le onListItemClick méthode:
Juste pour remarque, le productArray est une classe var définie par une autre méthode qui est titulaire d'un tableau de JSONObjects.
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(DvdListingActivity.this, MovieProductActivity.class);
try {
JSONObject jsonObj = productArray.getJSONObject(position);
i.putExtra("mTitle", jsonObj.getJSONObject("Title").opt("val").toString());
i.putExtra("mRelDate", jsonObj.getJSONObject("RelDate").opt("val").toString());
i.putExtra("mDesc", jsonObj.getJSONObject("Desc").opt("val").toString());
i.putExtra("mRating", jsonObj.getJSONObject("MPAA").getJSONObject("Rating").opt("val").toString());
i.putExtra("mActors", jsonObj.getJSONObject("Actors").opt("val").toString());
i.putExtra("mImage", jsonObj.getJSONObject("Image").opt("val").toString());
startActivity(i);
} catch (JSONException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
Le code ci-dessus fonctionne, mais je pense que il doit y avoir une meilleure façon pour moi de me transmettre des données à une autre Activité. Je pensais que je serais en mesure de passer un JSONObject qui contient toutes les données d'un dvd film, au lieu de la définition de chaque point de données individuellement.
J'ai essayé pendant une semaine et demi pour comprendre comment l'utiliser Parcelable. J'ai essayé de l'instanciation d'un JSONObject jsonObj qui implémente Parcelable avec pas de chance. J'ai continué à obtenir une erreur dans mon LogCat qui a dit que l'objet était de l'onu-parcelable.
J'ai essayé de lire le développeur Android site et sur d'autres blogs, mais je n'arrivais pas à appliquer leurs exemples de ce que je devais faire.
Toute aide serait grandement appréciée
- liés à vous de votre utilisation de ce site web, je crois que vous devriez lire ceci: meta.stackexchange.com/questions/16721/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement résumer toutes les informations à propos d'un film dans un
Movie
objet qui implémenteParcelable
.Le code est similaire à ci-dessus, mais au lieu de passer 6 différents extras que vous pouvez simplement passer un supplémentaire qu'est le film.
Pour plus d'informations sur la mise en œuvre d'un Parcelable objet, voir Parcelable docs. En gros, vous avez juste à écrire chaque chaîne dans 'writeToParcel', et de lire dans chaque chaîne dans 'readFromParcel" dans le bon ordre.
Vous pouvez simplement mettre un JSONObject comme une chaîne de caractères. Quelque chose comme ceci:
i.putString("product", jsonObj.toString);
Et puis, dans la
MovieProductActivity
vous pourriezJSONObject jsonObj = new JSONObject(getIntent().getStringExtra("product"));
La réponse posté ici par Cheryl Simon est tout à fait correcte mais cela pourrait ne pas l'expliquer aussi clairement pour quelqu'un qui est nouveau pour android ou java. S'il vous plaît laissez-moi poursuivre sur sa réponse.
La meilleure et la plus propre façon de le faire est avec l'interface Parcelable.
Déclarer une classe en tant que ci-dessous qui met en œuvre Parcelable. Celui-ci utilise un accesseur et mutateur qui n'est pas réellement nécessaire.
La prochaine étape serait de créer une instance de cette classe (dans ce cas JSonArrayParser) et le passer à travers le Bundle comme dans l'exemple ci-dessous.
//Ce qui pourrait être une Activité, d'un Fragment, DialogFragment ou toute classe qui utilise le Bundle Type comme savedInstanceState.
La façon dont votre serait de récupérer la valeur se présente comme suit (j'ai utilisé le onCreate mais vous pouvez récupérer la valeur de n'importe où):
Juste une remarque supplémentaire: vous pouvez le faire avec la coutume des constructeurs, mais cette méthode a été rendu obsolète par Google.
La vieille méthode dépréciée (associé avec l'app compat v4 PAS RECOMMANDÉ) serait:
Espérons que cette aide et efface un peu les choses.
L'interface Parcelable peut être utilisé avec n'importe quel classe de données avec ou sans mutateurs et/ou des accesseurs.
Êtes-vous stocker les informations dans une base de données? Si vous êtes, vous pouvez simplement transmettre l'ID du titre de votre choix (par l'intermédiaire de la volonté).
Ont un coup d'oeil à gson. Il vous permet de sereialise et deserialise JSON gouttes à l'ensemble des instances de classe.
Il suffit de créer un Colis comme ceci:
Et de mettre dans le bundle:
Enfin, vous pouvez obtenir le JSONObject arrière à l'aide de: