Проблема стиля при переопределении getDropDownView в ArrayAdapter

Я испытываю странное поведение при переопределении метода getDropDownView ArrayAdapter. Мне нужно переопределить этот метод, чтобы отобразить правильное строковое значение из моего пользовательского объекта. Вот как выглядит мой адаптер массива:

ArrayAdapter<NoteType> adapter = new ArrayAdapter<NoteType>(this, android.R.layout.simple_spinner_item, lstNoteTypes){
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView lbl = (TextView) super.getView(position, convertView, parent);
        lbl.setText(getItem(position).getName());
        return lbl;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        TextView lbl = (TextView) super.getView(position, convertView, parent);
        lbl.setText(getItem(position).getName());
        return lbl;
    }
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

Итак, когда я переопределяю getDropDownView, мой Spinner выглядит так: внизу высота элемента очень маленькая, и это не то, что я хочу:

enter image description here

Но когда я комментирую (или не переопределяю) метод getDropDownView, тогда он выглядит отлично с стилем по умолчанию, но тогда я не могу вставить требуемое текстовое значение в выпадающие элементы. enter image description here

Обратите внимание на высоту элементов на обоих изображениях только из-за переопределения getDropDownView.

Любые предложения? или что мне не хватает в моем коде?

Ответ 1

Если вы написали NoteType самостоятельно, переопределите toString() в нем. Просто добавьте следующее в класс NoteType:

@Override
public String toString() {
    return getName();
}

Ответ 2

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

Так как Spinner вызывает toString() для каждого объекта в ArrayAdapter, вы можете переопределить метод toString() в своем классе NoteType и позволить ему вернуть вашу String (вместо стандартной реализации toString()). Таким образом, вам не придется переопределять getDropDownView() в вашем адаптере, но по-прежнему у вас есть стиль по умолчанию и ваши данные.

Ответ 3

Я столкнулся с этой проблемой с пользовательским классом BaseAdapter. Это также упоминалось в комментарии, но решение на самом деле очень просто - просто добавьте дополнение к TextView, которое вы возвращаете из метода getDropDownView.

Вам не нужно добавлять дополнительные файлы для этого, и я не использовал ActionBarSherlock (только по умолчанию Spinner), поэтому я не думаю, что это связано с этим. Вот код, который работал у меня, адаптированный к вашему примеру:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Create custom TextView
    TextView lbl = (TextView) super.getView(position, convertView, parent);
    lbl.setText(getItem(position).getName());

    // Add padding to the TextView, scaled to device
    final float scale = context.getResources().getDisplayMetrics().density;
    int px = (int) (10 * scale + 0.5f);
    lbl.setPadding(px, px, px, px);

    return lbl;
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    // Create custom TextView
    TextView lbl = (TextView) super.getView(position, convertView, parent);
    lbl.setText(getItem(position).getName());

    // Add padding to the TextView, scaled to device
    final float scale = context.getResources().getDisplayMetrics().density;
    int px = (int) (10 * scale + 0.5f);
    lbl.setPadding(px, px, px, px);

    return lbl
}

Ответ 4

Придется делать то же самое, поэтому мой собственный взгляд будет использоваться как checkedTextView

в этом самое главное - установить такую ​​высоту Android: layout_height = "атр/dropdownListPreferredItemHeight" Я использовал базовый адаптер