Неправильное масштабирование при прокрутке после применения Colorfilter?

Сегодня я попытался сделать свой список более динамичным. Поэтому я создал белое изображение с девятью патчами и добавил цветной фильтр с помощью метода .setColorFilter. Это не проблема. Но после применения этого, каждый раз, когда я прокручиваю изображение, он масштабируется неправильно (случайным образом), поэтому позволяет сказать, что мой элемент имеет 100 дп с некоторым текстом. После прокрутки элемент все еще высок на 100dp, и весь текст отображается, но изображение в фоновом режиме теперь использует только 50dp.

Здесь мой код:

здесь, как я установил Colorfilter:

orgleftbox = context.getResources().getDrawable(R.drawable.list_bubble);
orgleftbox.setColorFilter( 0xff00c0ff, Mode.MULTIPLY );

и вот как я добавляю его в свой адаптер

v = inflater.inflate(R.layout.list_view_item, null);            
TextView t = (TextView)v.findViewById(R.id.text);
t.setBackgroundDrawable(orgrightbox);

Надеюсь, кто-то может мне помочь. Потому что эта ошибка раздражает меня, (

Ответ 1

Я смог самостоятельно решить проблему. Поэтому я отвечаю на это всем остальным;).

Проблема заключалась в том, что я загрузил мой drawable один раз в конструктор, потому что я думал, что мне не придется загружать его для каждого нового элемента списка. Но андроид-система обрабатывает их как один и тот же объект памяти. поэтому каждый фон listitem использует одно и то же mem-пространство (я надеюсь, что это не так, я так думаю). Если я начну прокрутку, следующий список будет объявлен и изменит высоту и ширину фона в соответствии с его потребностями, например, следующий элемент будет только 50 дп, он изменит сохраненное значение на это. Теперь любой другой фон списка изменится более или менее на эту высоту.

Простое исправление заключается в том, что вам необходимо загрузить и применить colorfilter для каждого нового элемента. ESPEC. в методе getView.

@Override
public View getView(int pos, View convertView, ViewGroup parent) {
    View v = null;
    leftbox = (NinePatchDrawable) r.getDrawable(R.drawable.bubble_green);
    leftbox.setColorFilter( 0xff00c0ff, Mode.MULTIPLY );

    v = inflater.inflate(R.layout.list_view_item_right, null);
    TextView t = (TextView)v.findViewById(R.id.text);
    t.setBackgroundDrawable(leftbox);

Надеюсь, этот ответ был полезен.

EDIT (в несколько раз проще):

Если вы хотите применить colorFilter к макету (Textview...), сделайте это так (спасибо Pasha):

TextView t = (TextView)v.findViewById(R.id.text);
t.getBackground().setColorFilter(0xff00c0ff, Mode.MULTIPLY );

Ответ 2

Ваша интерпретация верна, вы не можете использовать Drawable для нескольких представлений. У Drawable есть размер, заданный его представлением, поэтому, если вы одновременно присоедините его к нескольким представлениям, он не будет работать должным образом, если только представления имеют точно такое же измерение.