Как в адаптере выделить цветом только определенный айтем

422
29 декабря 2016, 07:02

Я использую для Spinner собственный адаптер, который должен изменять цвет первого пункта и в открытом состоянии, и в закрытом.
Проблема заключается в том, что после того, как был выбран другой пункт, при развёртывании Spinner цвет меняет не только первый пункт, а ещё и который был выбран до этого. Остальные пункты черного цвета, как мне и надо.
Вот код:

class CustomAdapter<T> extends ArrayAdapter<T>{
    CustomAdapter(Context cntxt, int resource, T[] objects) {
        super(cntxt, resource, objects);
    }
    @NonNull
    @Override
    public View getView(int pos, @Nullable View convertView, @NonNull ViewGroup p) {
        if (pos != 0)
            return super.getView(pos, convertView, p);
        TextView tv = (TextView) super.getView(pos, convertView, p);
        tv.setTextColor(Color.MAGENTA);
        return tv;
    }
    @Override
    public View getDropDownView(int pos, @Nullable View convertView, @NonNull ViewGroup p) {
        if (pos != 0)
            return super.getDropDownView(pos, convertView, p);
        TextView tv = (TextView) super.getDropDownView(pos, convertView, p);
        tv.setTextColor(Color.MAGENTA);
        return tv;
    }
}
Answer 1

Логика работы с адаптером должна явно задавать оба состояния для айтема (как отображать если условие совпадает и если не совпадает), а не одну его часть (если условие совпадает, для остальных другое).

Используйте конструкцию if - else, явно указывая, как должен выглядеть элемент при совпадении условия и как при не совпадении. Это связано с тем, что вид айтемов переиспользуется и если не указано иного вида, может быть использован созданный ранее вид (для другого айтема).

TextView tv = (TextView) super.getView(pos, convertView, p);
if (pos != 0)  tv.setTextColor(Color.BLACK);
 else  tv.setTextColor(Color.MAGENTA);
return tv;
Answer 2

Ваша логика отображения должна учитывать convertView:

  • если convertView==null - это первое отображение позиции
  • если convertView!=null, значит позиция уже сгенерирована и в теории можно использовать предыдущее значение (но очевидно в вашем случае это не так, так как предыдущее значение уже содержит в себе старый цвет).
READ ALSO
ArrayList. Доступ к элементу. Не всё так просто

ArrayList. Доступ к элементу. Не всё так просто

Столкнулся с такой проблемой, как получение данных из листаКазалось бы что всё просто, но вот не совсем

579
Как получить слово после знака &ldquo;?&rdquo;

Как получить слово после знака “?”

Как мне получить слово Izzume?

505