Android Spinner с разными макетами для «выпадающего состояния» и «закрытое состояние»?
-
09-10-2019 - |
Вопрос
У меня есть вид спиннер Android в моем макете. Я хотел бы, чтобы Спиннер показать только один текстовый элемент при закрытии, но когда пользователь нажимает на нем (то есть открывает диалог спиннера), я хотел бы показать более широкую информацию для каждого элемента, включая значок и дополнительное описание Отказ Как сейчас Spinner показывает тот же макет (значок, заголовок + описание) в обоих состояниях.
Если я приложу ArrayAdapter к спиннеру, то я получаю доступ к чему-то под названием «SetDropDownViewResource», но это не обязательно то, что мне нужно, так как мои спиннерские данные выбираются из курсора, а не из любых видов (у меня есть, поскольку сейчас создал свой собственный адаптер, расширяющий басдер).
Любой, кто может мне помочь?
Решение
Вы должны создать пользовательский Adapter
класс для спиннера и перезаписать два метода getView()
для нормального закрытого взгляда и getDropDownView()
для выпадающего списка. Оба метода должны вернуть View
объект для одного элемента.
Посмотри на Это руководство Это может помочь вам начать работу.
Другие советы
У меня тоже было проблем. Вместо того, чтобы переопределить класс, я есть более простой способ сделать это.
Но сначала нужно понять разницу между идентификатором ресурса в конструкторе адаптера, а другой в setDropDownViewResource(...)
. Отказ Например,
SimpleAdapter adapter =
new SimpleAdapter(ab.getThemedContext(), data, R.layout.actionbar_dropdown, new String[] { "EventID", "Icon" },
new int[] { R.id.event_id, R.id.icon });
adapter.setDropDownViewResource(R.layout.actionbar_list_item);
R.layout.actionbar_dropdown
это стиль для спиннер, и R.layout.actionbar_list_item
Для каждого элемента одного списка.
Я использовал SimpleAdapter здесь, поскольку если я использую ArrayAdapter, XML может быть только одним TextView.
R.layout.actionbar_list_item
Содержит TextView, идентификатор которого является event_id
и ImageView, идентификатор которого является icon
.
R.layout.actionbar_dropdown
почти точно так же, как actionbar_list_item
, но видимость ImageView последнего устанавливается на ПРОШЛО.
Таким образом, каждый элемент списка имеет TEXTVIEW и ImageView, но вы увидите только TextView на Spinner.
Используя код учебника, связанного FLO, я создал следующую настройку SPSSSNERADAPTER, чтобы показать два разных набора строк, один, когда элементы отображаются, и один, когда нет. Я надеюсь, что это поможет кому-то.
public class CustomSpinnerAdapter extends ArrayAdapter<String> {
Context mContext;
int mTextViewResourceId;
String[] mObjects;
String[] mShortNameObjects;
public CustomSpinnerAdapter(Context context, int textViewResourceId,
String[] objects, String[] shortNameObjects) {
super(context, textViewResourceId, objects);
mContext = context;
mTextViewResourceId = textViewResourceId;
mObjects = objects;
mShortNameObjects = shortNameObjects;
}
@Override
public View getDropDownView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
row.setText(mObjects[position]);
return row;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
row.setText(mShortNameObjects[position]);
return row;
}
}
И использование внутри фрагмента:
CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names));
Наконец, макет для элемента спиннера:
Spinner_item.xml.
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18dip"
android:gravity="left"
android:textColor="@color/navdraw_list_item_background_default"
android:padding="5dip" />
Устанавливает только ресурс View View с вашим альтернативным макетом:
ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER);
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown);
view.setAdapter(genderAdapter);
Для меня это только макет с дополнительной прокладкой, потому что мой фон Спиннера - это закругленный рисунок и требует этого дополнительного пространства.
Просто позвоните на метод setupspinner () после получения ссылки на Spinner
// Вот метод setupspinner
private void setupSpinner() {
// Create adapter for spinner. The list options are from the String array it will use
// the spinner will use the default layout
ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(this,
R.array.array_dropdown_options, android.R.layout.simple_spinner_item);
// Specify dropdown layout style - simple list view with 1 item per line
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
// Apply the adapter to the spinner
spinner.setAdapter(spinnerAdapter);
// spinner is referenced spinner by finViewById.
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selection = (String) parent.getItemAtPosition(position);
if (!TextUtils.isEmpty(selection)) {
if (selection.equals(getString(R.string.item_a))) {
// your code for selected item whose id equals to id to R.string.item_a
} else if (selection.equals(getString(R.string.item_b))) {
// your code
} else {
// your code
}
}
}
// Because AdapterView is an abstract class, onNothingSelected must be defined
@Override
public void onNothingSelected(AdapterView<?> parent) {
// code for nothing selected in dropdown
}
});
}