1

すべての行に進行状況バーを含む ListView の静的 SoftReferenceMap にドローアブルを格納しようとしています。行ごとに進行状況が異なりますが、 setProgress(int) を介して設定すると、すべての行が影響を受けます。

mDrawable.mutate().setLevel(progress*10000/max) を実行してみましたが、まだ機能しません。

public void setProgres(int status, int progress, int max) {

        Drawable d = getDrawable(status);

        switch (status) {
        case RED_INDETERMINATE:
            setIndeterminateDrawable(d);
            setIndeterminate(true);
            break;
        case YELLOW:
            d.mutate().setLevel((int) (progress * 10000 / max));
        case GREEN:
        case BLUE:
            setProgressDrawable(d);
            break;

        default:
            throw new IllegalArgumentException(
                    "Invalid Status setting for ArtooProgressBar: " + status);
        }

        getProgressDrawable().invalidateSelf();
        super.invalidate();
    }

    private Drawable getDrawable(int status) {

        SoftReference<Drawable> ref = sDrawableMaps.get("" + status);

        if (ref != null && ref.get() != null)
            return ref.get();

        Drawable d;

        switch (status) {
        case RED_INDETERMINATE:
            d = getResources().getDrawable(
                    R.drawable.progress_bar_indeterminate);
            d = tileifyIndeterminate(d);
            break;
        case YELLOW:
            // d = yellow;
            d = getResources().getDrawable(
                    R.drawable.progress_bar_determinate_yellow);
            break;
        case GREEN:
            d = getResources().getDrawable(
                    R.drawable.progress_bar_determinate_green);
            d.setLevel(10000);
            break;
        case BLUE:
            d = getResources().getDrawable(
                    R.drawable.progress_bar_determinate_blue);
            d.setLevel(10000);
            break;

        default:
            throw new IllegalArgumentException(
                    "Invalid Status setting for ArtooProgressBar: " + status);
        }

        if (d != null)
            sDrawableMaps.put("" + status, new SoftReference<Drawable>(d));

        d.invalidateSelf();
        return d;

    }

私は何が欠けていますか?

ありがとう

4

1 に答える 1

3

複数のビューで同じ Drawable インスタンスを共有しているようです。基本的に、それをしないでください。必要な Drawable ごとに Resources.getDrawable() を呼び出すだけでなく、この sDrawableMaps キャッシュ処理を行っているのはなぜですか? トラブルの原因と考えられます。

また、 mutate() の使用は、あなたが考えていることをするつもりはありません.Drawableがまだ変更可能でない場合、これは新しいDrawableインスタンスを返します。これを変更すると、実際には誰も見えません. すでに変更可能な場合、同じインスタンスを返しますが、その場合、mutate() を呼び出す理由はありませんでした。

于 2010-10-30T20:14:27.330 に答える