Странное поведение при использовании пользовательского ArrayAdapter for Spinner Dropdown (дублирование элементов после щелчка) (Android)

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

Итак, сначала я попробовал следующее:

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item_title, R.id.text, list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Вероятно, потому что у первого есть изображение, а у второго просто TextView, я не мог использовать это (всегда выбрасывать исключение - NullPointerException)

Итак, я создал для этого собственный ArrayAdapter, и он отлично работал с макетами, но появилась другая проблема: когда я выбираю элемент, этот элемент исчезает из выпадающего списка, а его место занимает другой элемент.

Например, это начальное состояние:

|item 1|

item 1
item 2
item 3
item 4

Затем я хочу выбрать элемент 4 (после выбора раскрывающийся список скрывается):

|item 4|

И когда я снова нажимаю, чтобы выбрать другой элемент, он выглядит так:

|item 4|

item 1
item 2
item 3
item 1

Кто-нибудь знает решение? Я хочу, чтобы все элементы всегда отображались в раскрывающемся списке (без дубликатов)!


person Eggakin Baconwalker    schedule 27.10.2015    source источник
comment
Не могли бы вы показать свой класс адаптера?   -  person Sunil Kumar    schedule 01.03.2017


Ответы (1)


у меня была эта проблема с пользовательским адаптером, в моем случае решение состояло в том, чтобы заменить это:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflator.inflate(R.layout.spinner_item, null);

        ViewHolder holder= new ViewHolder();
        holder.textTitle = (TextView) convertView.findViewById(R.id.textSpinnerItem);
        holder.textTitle.setText(spinnerItems.get(position).getName());
        holder.image = (ImageView) convertView.findViewById(R.id.imageSpinnerItem);
    }


    return convertView;
}

с этим: (кажется, что в некоторых случаях, когда вы щелкаете в раскрывающемся элементе, convertView имеет значение null)

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = inflator.inflate(R.layout.spinner_item, null);
    }
    ViewHolder holder= new ViewHolder();
    holder.textTitle = (TextView) convertView.findViewById(R.id.textSpinnerItem);
    holder.textTitle.setText(spinnerItems.get(position).getName());
    holder.image = (ImageView) convertView.findViewById(R.id.imageSpinnerItem);

    return convertView;
}

Надеюсь это поможет

person Eme Hunter    schedule 01.03.2017