2012-05-06 3 views
0

アイテムにListViewがあり、各アイテムに5つのTextViewがあり、このTextViewの1つがHtml.fromHtml関数からテキストを取得しています.IgGタグをHTMLで処理するImageGetter関数、 、ダウンロードしている画像はAnimationDrawable(サイクリング進行状況バー)を表示したい。ここでAndroid AnimationDrawableがすべてのListViewアイテムで機能していない

は私のImageGetter実装です:

holder.CommentText.setText(Html.fromHtml(commentObj.getComment(), new ImageGetter() { 


        @Override 
        public Drawable getDrawable(String source) { 
          Drawable d = null; 
          if(UserSettings.LoadImages) 
          { 
            if(commentObj.getImages()==null) 
            { 
              commentObj.setImages(new HashMap<String, Drawable>()); 
            } 

            String imageLink=source; 
            if(!imageLink.contains("http://")) 
              imageLink="http://rotter.net"+source; 
            if(commentObj.getImages().containsKey(imageLink)) 
            { 
              d=commentObj.getImages().get(imageLink); 
              d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
            } 
            else 
            { 
              AnimationDrawable animated=(AnimationDrawable)context.getResources().getDrawable(R.anim.image_loading); 
              animated.setBounds(0, 0, animated.getIntrinsicWidth(), animated.getIntrinsicHeight()); 
              //animated.start(); 
          commentObj.getImages().put(imageLink, animated); 
          DownloadImage downImg=new DownloadImage(commentObj, imageLink,v,adapter,Width,context.getResources()); 
          holder.CommentText.onAttachedToWindow(); 
          downImg.execute(new String[] { imageLink }); 
          return animated; 
            } 
          } 
          return d; 
        } 
      },null)); 

いくつか読みになった後、私は、新しいカスタムのTextViewクラスを作成しました:AnimationDrawableを起動および停止する責任

public class NewTextView extends TextView { 

    private Handler mHandler=new Handler(); 

    public NewTextView(Context context) { 
      super(context); 
      // TODO Auto-generated constructor stub 
    } 

    public NewTextView(Context context,AttributeSet attributeSet) { 
      super(context,attributeSet); 
      // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 

     handleAnimationDrawable(true); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 

     handleAnimationDrawable(false); 
    } 

    private void handleAnimationDrawable(boolean isPlay) { 
     CharSequence text = getText(); 
     if (text instanceof Spanned) { 
      Spanned span = (Spanned) text; 
      ImageSpan[] spans = span.getSpans(0, span.length() - 1, 
        ImageSpan.class); 
      for (ImageSpan s : spans) { 
       Drawable d = s.getDrawable(); 
       if (d instanceof AnimationDrawable) { 
        AnimationDrawable animationDrawable = (AnimationDrawable) d; 
        if (isPlay) { 
         animationDrawable.setCallback(this); 
         animationDrawable.start(); 
        } else { 
         animationDrawable.stop(); 
         animationDrawable.setCallback(null); 
        } 
       } 
      } 
     } 
    } 

    @Override 
    public void invalidateDrawable(Drawable dr) { 
     invalidate(); 
    } 

    @Override 
    public void scheduleDrawable(Drawable who, Runnable what, long when) { 
     if (who != null && what != null) { 
      mHandler.postAtTime(what, when); 
     } 
    } 

    @Override 
    public void unscheduleDrawable(Drawable who, Runnable what) { 
     if (who != null && what != null) { 
      mHandler.removeCallbacks(what); 
     } 
    } 
} 

NewTextViewクラス、 その結果、アニメーションを作成しているAnimationDrawablesのいくつか(サイクル進行状況バー)とAnimationDrawableがまったく実行されない場合、AnimationDrawableアイテムの最初のDrawableのみが表示されます。

何が問題なのですか?アニメーションドローラブルが正しく動作しないのはなぜですか?

+0

コードを見ることなく、何が開始され、何が停止しているかを確認するために、いくつかのログ出力を入れることをお勧めします。 LogView(String tag、String message) – Warpzit

+0

@Warpzit Logをコードに追加したところ、ListViewのすべてのNewTextViewsがonAttachedToWindow()関数を呼び出すわけではないことに気づいた。 – Alex

+0

リストビューの行をリサイクルする方法と、おそらく、アニメーションの仕方を再設計する必要があります。 – Warpzit

答えて

0

アイテムのメソッド "onAttachedToWindow"が複数回呼び出されているかどうかを確認することができ、そのたびに無効化が発生します。

関連する問題