Подтвердить что ты не робот

Android Spinner с различными макетами для "выпадающего состояния" и "закрытого состояния"?

У меня есть вид Android Spinner в моем макете. Я бы хотел, чтобы этот счетчик отображал только один текстовый элемент при закрытии, но когда пользователь нажимает на него (т.е. Открывает диалог spinner), я хотел бы показать более обширную информацию для каждого элемента, включая значок и дополнительное текстовое представление описания, Как сейчас, счетчик показывает тот же самый макет (значок, название + описание) в обоих состояниях.

Если я присоединяю ArrayAdapter к счетчику, я получаю доступ к чему-то, называемому "setDropDownViewResource", но это не обязательно то, что мне нужно, поскольку мои данные счетчика извлекаются из курсора не из любого массива (у меня есть, на данный момент создал мой собственный адаптер, расширяя BaseAdapter).

Кто может мне помочь?

4b9b3361

Ответ 1

Вам нужно создать собственный Adapter класс для Spinner и перезаписать два метода getView() для нормального закрытого вида и getDropDownView() для раскрывающегося списка. Оба метода должны возвращать объект View для одного элемента.

Посмотрите этот учебник, это может помочь вам начать работу.

Ответ 2

У меня тоже была проблема. Вместо того, чтобы переопределять класс, у меня есть более простой способ сделать это.

Но сначала вам нужно понять разницу между идентификатором ресурса в конструкторе адаптера, а другой - в 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 может быть только одним TextView. R.layout.actionbar_list_item содержит TextView, чей идентификатор - event_id и ImageView, чей идентификатор - значок. R.layout.actionbar_dropdown почти точно совпадает с actionbar_list_item. Но видимость ImageView последнего установлена ​​в GONE.

Таким образом, каждый элемент списка имеет текстовое представление и изображение, но вы увидите только текстовое изображение на счетчике.

Ответ 3

Используя код учебника, связанный с 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" />

Ответ 4

Только устанавливает ресурс просмотра выпадающего списка с помощью альтернативного макета:

ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER);
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown);
view.setAdapter(genderAdapter);

Для меня это только макет с дополнительным дополнением слева, потому что мой фон спиннера округлен и требует дополнительного пространства.