Ответ 1
Если вы написали NoteType самостоятельно, переопределите toString() в нем. Просто добавьте следующее в класс NoteType:
@Override
public String toString() {
return getName();
}
Я испытываю странное поведение при переопределении метода 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 выглядит так: внизу высота элемента очень маленькая, и это не то, что я хочу:
Но когда я комментирую (или не переопределяю) метод getDropDownView
, тогда он выглядит отлично с стилем по умолчанию, но тогда я не могу вставить требуемое текстовое значение в выпадающие элементы.
Обратите внимание на высоту элементов на обоих изображениях только из-за переопределения getDropDownView
.
Любые предложения? или что мне не хватает в моем коде?
Если вы написали 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 = "атр/dropdownListPreferredItemHeight" Я использовал базовый адаптер