2016-02-16 4 views
0

Encore une fois, j'ai essayé de trouver des réponses partout sur le net. Cependant, je n'arrive pas à trouver un correspondant à mon problème. Fondamentalement, j'ai une liste d'émoticônes d'une API que j'utilise et j'essaye d'obtenir ces images à afficher dans un TextView qui ne fonctionne tout simplement pas. Les images apparaissent sous la forme de carrés bleus dans ma vue de recyclage jusqu'à ce que je les défile vers le haut puis qu'elles apparaissent. Voici mon code et je ne suis pas sûr que ce que je fais est correct. Je ne me souviens pas pourquoi j'ai fait ce que j'ai fait car c'est un vieux code et j'essaie de le refactoriser. Quelqu'un peut-il aider?Picaso avec ImageGetter dans TextView de JSON

Voici le code:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Posts posts = mPost.getItem(position); 
    emoticons = mEmoticon.getItems(); 
    String message = null; 
    String emoMessage = null; 

    if (posts.getPost() != null) { 
     if (posts.getPost().getMessage() != null) { 
      message = posts.getPost().getMessage(); 
      emoMessage = message; 


      if (emoticons != null) { 
       for (Emoticons emoticon : this.emoticons) { 
        if (message.contains(emoticon.getEmoticon().getCode())) { 
         emoMessage = message.replaceAll(Constants.EMO_REGEX, emoticon.getEmoticon().getUrl()); 
        } 

       } 
      } 

holder.mPostTextView.setText(Html.fromHtml(emoMessage, new Html.ImageGetter() { 
      @Override 
      public Drawable getDrawable(final String source) { 
       Target loadTarget; 
       loadTarget = new Target() { 
        @Override 
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
         try { 
          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
          StrictMode.setThreadPolicy(policy); 
          URL url = new URL(source); 
          InputStream is = url.openStream(); 
          Bitmap b = BitmapFactory.decodeStream(is); 
          mDrawable = new BitmapDrawable(Resources.getSystem(), b); 
          mDrawable.setBounds(0, 0, mDrawable.getIntrinsicWidth() + 25, mDrawable.getIntrinsicHeight() + 25); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onBitmapFailed(Drawable errorDrawable) { 

        } 

        @Override 
        public void onPrepareLoad(Drawable placeHolderDrawable) { 

        } 
       }; 
       Picasso.with(mContext).load(source).into(loadTarget); 
       return mDrawable; 
      } 
     }, null); 
} 

Répondre

0

Il semble que lorsque vous appelez mPostTextView.setText() votre mDrawable n'a pas encore été initialisées. Plus tard, lorsque onBitmapLoaded() est appelé, vous mettez à jour mDrawable pour pointer vers BitmapDrawable nouvellement créé. Mais cela ne mettra pas à jour le TextView.

Je voudrais essayer de réorganiser les choses pour que l'intérieur onBindViewHolder() que vous appelez

Picasso.with(mContext).load(source).into(loadTarget);

puis à la fin de onBitmapLoaded() appeler mPostTextView.setText(). Dans le cas où vous auriez besoin de garder une référence à emoMessage entre temps, vous pouvez le passer comme champ dans votre cible.

+0

Mais je fais tout cela dans mon setText() comment pourrais-je changer cela? – BilalMH

+0

Désolé - j'ai eu un autre regard et je ne pense pas que mon idée fonctionnera. Cela peut aider? http://stackoverflow.com/questions/25194549/using-picasso-with-image-getter – danwilkie