アイテムに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のみが表示されます。
何が問題なのですか?アニメーションドローラブルが正しく動作しないのはなぜですか?
コードを見ることなく、何が開始され、何が停止しているかを確認するために、いくつかのログ出力を入れることをお勧めします。 LogView(String tag、String message) – Warpzit
@Warpzit Logをコードに追加したところ、ListViewのすべてのNewTextViewsがonAttachedToWindow()関数を呼び出すわけではないことに気づいた。 – Alex
リストビューの行をリサイクルする方法と、おそらく、アニメーションの仕方を再設計する必要があります。 – Warpzit