Intereting Posts
Android HTML ImageGetter как AsyncTask Переопределение префикса пакета разрешений GCM с Gradle Как заменить устаревший android.support.v4.app.ActionBarDrawerToggle Android – Пользовательский цвет фона предупреждений Последствия поддержки нескольких пользователей Android (новые в версии 4.2) для модели данных на стороне сервера (например, android_id) Импортировать xml в другой xml Com.admob.android.ads.AdView unbound prefix? OnCancelListener не вызывается в DialogFragment Окно оверлей системы Android <Ваше приложение> имеет проблемы с сервисами Google Play. При использовании GoogleApiClient он всегда запускается onConnectionFailed Пример сообщения проекта проекта GCM «Не удалось найти google-play-services_lib.apk» Когда необходимо выполнить invalidate () в представлении? JNI Warnig ожидает возвращения типа 'L', вызывающего LocationManager.requestLocationUpdates Android.os.BadParcelableException: ClassNotFoundException при unmarshalling: com.facebook.flatbuffers.helpers.FlatBufferModelHelper $ LazyHolder Записать на экран Android Wear

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

Я испытываю странное поведение при переопределении метода ArrayAdapter для 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 выглядит как ниже – высота элемента очень маленькая по размеру, а это не то, что я хочу:

Введите описание изображения здесь

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

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

Какие-либо предложения? Или что мне не хватает в моем коде?

Solutions Collecting From Web of "Проблема стиля при переопределении getDropDownView в ArrayAdapter"

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

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

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

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

Я столкнулся с этой проблемой с обычным классом 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 } 

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

В этом самое главное – установить высоту, например, android: layout_height = "? Attr / dropdownListPreferredItemHeight" Я использовал базовый адаптер