Android Spinner с различными макетами для "выпадающего состояния"и" закрытого состояния"?
У меня есть Android Spinner view в моем макете. Я хотел бы, чтобы этот счетчик показывал только один текстовый элемент при закрытии, но когда пользователь нажимает на него (т. е. открывает диалоговое окно spinner), я хотел бы показать более обширную информацию для каждого элемента, включая значок и дополнительное текстовое описание. Как и сейчас, счетчик показывает тот же макет (значок, заголовок + описание) в обоих состояниях.
Если я прикрепляю ArrayAdapter к спиннеру, то я получаю доступ к что-то называется "setDropDownViewResource", но это не обязательно то, что мне нужно, так как мои данные spinner извлекаются из курсора, а не из массива любого вида (на данный момент я создал свой собственный адаптер, расширяя BaseAdapter).
кто может мне помочь?
5 ответов:
вы должны создать пользовательскую
Adapter
класс для блесны и перезаписать два методаgetView()
для нормального закрытого вида иgetDropDownView()
в выпадающем списке. Оба метода должны возвращать aView
"объект" для одного элемента.посмотреть в этом уроке это может помочь вам начать.
у меня тоже были проблемы. Вместо того, чтобы переопределять класс, у меня есть более простой способ сделать это.
но сначала вам нужно понять разницу между идентификатором ресурса в конструкторе адаптера и другим в
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
стиль для spinner иR.layout.actionbar_list_item
для каждого элемента списка.я использовал SimpleAdapter здесь, так как если я использую ArrayAdapter, xml может быть только один текстовый вид.
R.layout.actionbar_list_item
содержит TextView, идентификатор которогоevent_id
и ImageView, чей идентификаторicon
.
R.layout.actionbar_dropdown
почти точно так же, какactionbar_list_item
, но видимость ImageView последнего установлена в ушел.таким образом, каждый элемент списка имеет textview и imageview, но вы увидите только textview на spinner.
используя код учебника, связанного с Flo, я создал следующий CustomSpinnerAdapter, чтобы показать два разных набора строк, один, когда элементы отображаются, и один, когда нет. Надеюсь, это кому-то поможет.
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:
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" />
только устанавливает ресурс раскрывающегося списка с вашим альтернативным макетом:
ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER); genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown); view.setAdapter(genderAdapter);
для меня это только макет с дополнительным заполнением слева, потому что мой фон spinner является округлым рисованием и требует этого дополнительного пространства.
просто вызовите метод 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 } }); }