我试图将可绘制对象存储在静态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;

    }


我想念什么?

谢谢

最佳答案

看来您正在多个视图中共享同一个Drawable实例。基本上,不要那样做。为什么要执行此sDrawableMaps缓存操作,而不是仅为所需的每个Drawable调用Resources.getDrawable()?这可能是造成麻烦的原因。

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

关于android - Android Drawable mutate()和setLevel(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4058099/

10-11 00:35