2017-08-21 2 views
1

Je souhaite extraire les données json de l'URL pour les afficher dans l'interface utilisateur. Mais n'a pas réussi à désérialiser les données dans le bon ordre. J'utilise Retrofit 1.9. Le problème est quand je cours ce code avec n'importe quelle image désérialiser la fonctionnalité, par exemple le titre, le corps, updateDate cette fois-ci cela fonctionne bien. Je peux voir le recyclerview avec le cap et la date. mais quand j'essaye de courir avec le code de follwoing, le recyclerview se vide. Je ne vois rien à ce sujet. Je fais de mon mieux pour identifier. Bu rien ne pourrait résoudre mon problème. Ce serait vraiment utile pour moi si quelqu'un m'aide à identifier le problème.Récupérer le remplissage avec json

Le contrôleur classe

public class NewsController { 
private static final String TAG = NewsController.class.getSimpleName(); 
private UserCallbackListener mListener; 
private NewsRestApiManager mApiManager; 

public NewsController(UserCallbackListener listener) { 
    mListener = listener; 
    mApiManager = new NewsRestApiManager(); 
} 

public void startFetching(){ 

    mApiManager.getNewsApi().getNews(new Callback<String>() { 

     @Override 
     public void success(String s, Response response) { 
      Log.d(TAG, "JSON :: " + s); 

      try { 
       JSONArray array = new JSONArray(s); 

       for(int i = 0; i < array.length(); i++) { 
        JSONObject object = array.getJSONObject(i); 

        NewsModel news = new NewsModel(); 
        news.setTitle(object.optString("title")); 
        news.setBody(object.optString("body")); 

        /* if I comment downd this postion the app run perfectly but except image*/ 
        ArrayList<AppImage> list = new ArrayList(); 
        JSONArray imageArray =object.getJSONArray("appImages"); 
        for(int j=0; j<imageArray.length();j++){ 
         AppImage appImages = new AppImage(); 
         appImages.setSrc(imageArray.getJSONObject(j).getString("src")); 
         list.add(appImages); 
        } 
        news.setAppImages(list); 

       // I want to set this image ad Heading Image 
        JSONObject jo=object.getJSONObject("teaserImageSmall​"); 
        TeaserImageSmall coverImage=new TeaserImageSmall(); 
        coverImage.setSrc(jo.optString("src")); 
        news.setTeaserImageSmall(coverImage); 
        mListener.onFetchProgress(news); 

       } 

      } catch (JSONException e) { 
       mListener.onFetchFailed(); 
      } 


      mListener.onFetchComplete(); 
     } 

     @Override 
     public void failure(RetrofitError error) { 
      Log.d(TAG, "Error :: " + error.getMessage()); 
      mListener.onFetchComplete(); 
     } 
    }); 

} 
public interface UserCallbackListener{ 
    void onFetchStart(); 
    void onFetchProgress(NewsModel news); 
    void onFetchProgress(List<NewsModel> userList); 
    void onFetchComplete(); 
    void onFetchFailed(); 
} 

}

Ma classe d'adaptateur est

@Override 
public void onBindViewHolder(NewsHolder holder, int position) { 
    final NewsModel currentNews = mNews.get(position); 
    Picasso.with(holder.itemView.getContext()); 
    Picasso.with(holder.itemView.getContext()).load(currentNews.getTeaserImageSmall().getSrc()).into(holder.newsImage); 

    holder.newsHeadline.setText(currentNews.getTitle()); 
    holder.newsDate.setText(currentNews.getPostDate()); 
    holder.cardView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i=new Intent(context,DetailNews.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      //i.putExtra("image",newsModel.getImage()); 
      i.putExtra("title",currentNews.getTitle()); 
      i.putExtra("body",currentNews.getBody()); 
      context.startActivity(i); 
     } 
    }); 

Répondre

0
appImages.setSrc(imageArray.optString(("src"))); 

Ne pas utiliser Integer.parseInt ici, puisque vous avez des données de chaîne dans src. Ajouter cette liste à NewsModel.appImages=list; en dehors de l'itération de ce tableau d'images.

Maintenant En classe Adaptateur,

holder.newsImage.appImage.get(position).getSrc(); 

espère que cela fonctionne :)

+0

Comment puis-je obtenir source de –

+0

TeaserImageSmall Je ne suis pas sûr de la implementtaion JSONARRAY jsonarray = object.optString (» appImages ") ;. Parce que je définis déjà le tableau json. Dois-je le faire deux fois? Pourriez-vous expliquer plus en fonction de mon code –

+0

Bien sûr .. TeaserImageSmall n'est pas nécessaire. vous devez définir un autre tableau json parce que dans votre json "appImages" a une donnée de tableau json donc la réponse vous donnera un tableau que vous devez itérer. Vous pouvez vous référer à l'analyse des données json imbriquées qui vous aideront plus. – Ankit

0
NewsModel.AppImages appImages = new NewsModel.AppImages(); 
appImages.setSrc(imageArray.optString(("src"))); 

Ne pas utiliser Integer.parseInt ici, puisque vous avez des données de chaîne dans src. Ajouter cette liste à

NewsModel.appImages=list; 

itération en dehors de ce tableau d'images.

JSONOBJECT Jo= object.getJsonObject("teaserImageSmall​"); 
NewsModel.teaserImageSmall= Jo.optString("src"); 

Maintenant En classe Adaptateur,

holder.newsImage.setImage(mNews.appImage.get(position).getSrc()); 
String cover= mNews.teaserImageSmall; 

espère que cela fonctionne :)

+0

votre code ne fonctionne pas. Je ne peux toujours pas étayer votre code –

+0

Buddy, Cela devrait analyser le json ci-dessus fourni par vous. Peut être une erreur de frappe mineure est ici .. mais le code est correct. Il est basique json parsing – Ankit

+0

J'ai modifié ma question. J'ai créé une classe séparée pour appimage et teaserImageSample. Maintenant, si je cours mon code sans partie de tableau d'image, cela fonctionne. cette fois seul le titre et la date sont affichés dans recyclerview. mais si je veux l'exécuter avec le code d'URL d'image, le reycclerview devient vide. Si vous avez besoin de ma classe de modèle, je peux aussi le fournir dans ce code. Je ne comprends pas quel serait le problème dans la classe de contrôleur. –