Android Drawable mutate () и setLevel () - PullRequest
       34

Android Drawable mutate () и setLevel ()

1 голос
/ 30 октября 2010

Я пытаюсь сохранить рисованные объекты в статической SoftReferenceMap для ListView, содержащего индикаторы выполнения в каждой строке. Каждая строка имеет разный прогресс, но когда я устанавливаю его через setProgress (int), это затрагивает все строки.

Я пытался сделать mDrawable.mutate (). SetLevel (прогресс * 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;

    }

Чего мне не хватает?

Спасибо

1 Ответ

2 голосов
/ 31 октября 2010

Похоже, что вы используете один и тот же Drawable экземпляр для нескольких представлений.По сути, не делай этого.Почему вы делаете эту вещь в кеше sDrawableMaps вместо того, чтобы просто вызывать Resources.getDrawable () для каждого необходимого Drawable?Это, вероятно, является причиной проблемы.

Кроме того, использование вами mutate () не будет делать то, что вы думаете - если Drawable еще не изменяем, то это возвращает новый Drawable экземпляр, который вы затем модифицируетеи никто на самом деле не видит.Если он уже изменчив, он возвращает тот же экземпляр, но в этом случае не было причин вызывать mutate () для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...