2016-02-16 4 views
0

Опять же, я пытаюсь найти ответы по всей сети. Однако я не могу найти, чтобы он соответствовал моей проблеме.Picaso с ImageGetter в TextView от JSON

В принципе, у меня есть список смайликов из API, который я использую, и я пытаюсь отобразить эти изображения в TextView, который просто не работает. Изображения отображаются в виде синих квадратов в моем режиме обработки, пока я не вернусь к ним, затем они появятся. Вот мой код, и я не уверен, что я делаю правильно. Я не могу вспомнить, почему я сделал то, что сделал, поскольку это старый код, и я пытаюсь его реорганизовать. Может ли кто-нибудь помочь?

Вот код:

@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); 
} 

ответ

0

кажется, что, когда вы звоните mPostTextView.setText() ваш mDrawable еще не был инициализирован. Позже, когда вызывается onBitmapLoaded(), вы затем обновляете mDrawable, чтобы указать на новый созданный BitmapDrawable. Но это не будет обновлять TextView.

Я хотел бы попробовать переставить вещи так, что внутри onBindViewHolder() вы звоните

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

, а затем в конце onBitmapLoaded() вызов mPostTextView.setText(). Если вам нужно сохранить ссылку на emoMessage, вы можете передать его в качестве поля в своей Целевой.

+0

Но я делаю все это в своем setText(), как бы мне это изменить? – BilalMH

+0

Извините, у меня был другой взгляд, и я не думаю, что моя идея будет работать. Это может помочь? http://stackoverflow.com/questions/25194549/using-picasso-with-image-getter – danwilkie