1

我正在尝试将可绘制对象存储在静态 SoftReferenceMap 中,以便 ListView 在每一行中都包含进度条。每行都有不同的进度,但是当我通过 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 实例。基本上,不要那样做。你为什么要做这个 sDrawableMaps 缓存而不是为你需要的每个 Drawable 调用 Resources.getDrawable() ?这很可能是麻烦的原因。

此外,您对 mutate() 的使用不会按照您的想法进行 - 如果 Drawable 不是已经可变的,那么这将返回一个新的 Drawable 实例,然后您对其进行修改并且实际上没有人看到。如果它已经是可变的,它会返回相同的实例,但在这种情况下,没有理由对其调用 mutate()。

于 2010-10-30T20:14:27.330 回答