Android - выпадающий текст / выбор Spinner не отображается

Я использую этот пример кода для заполнения Spinner. Данные считываются из базы данных. Выбор отображается правильно — в данном случае он показывает «Зеленый» и «Красный».

    Spinner spinnerColor = (Spinner) findViewById(R.id.spinnertProfile);

    mProfileDbHelper = new ProfileDbAdapter(this);
    mProfileDbHelper.open();

    Cursor profilesCursor = mProfileDbHelper.fetchAllProfiles();
    startManagingCursor(profilesCursor);

    // Create an array to specify the fields we want to display in the list
    String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };

    // and an array of the fields we want to bind those fields to
    int[] to = new int[] { R.id.textviewColors };

    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
            R.layout.profile_color, profilesCursor, from,
            to);

    spinnerColor.setAdapter(profilesAdapter);

}

Однако когда я перешел на использование другого макета android.R.layout.simple_spinner_dropdown_item. Текст Spinner исчез.

    // Now create a simple cursor adapter and set it to display
    SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
            R.layout.profile_color, profilesCursor, from,
            to);

    profilesAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinnerColor.setAdapter(profilesAdapter);

См. снимки без и с simple_spinner_dropdown_item ниже: введите описание изображения здесь

Что-нибудь, что я могу пропустить?


person user370640    schedule 18.06.2010    source источник
comment
textviewColors используется в simple_spinner_dropdown_item? Я бы перепроверил на опечатки.   -  person Rich Schuler    schedule 19.06.2010
comment
Qberticus, я не уверен, что понимаю, что вы говорите. Я новичок в Android :-) TextviewColors — это идентификатор TextView в layout/profile_color.xml, где profilesAdapter ссылается на экземпляр SimpleCursorAdapter. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="" android:id="@+id/textviewColors" android:layout_width="wrap_content" android:layout_height="wrap_content"> </TextView> </LinearLayout>   -  person user370640    schedule 19.06.2010


Ответы (3)


Хорошо, когда вы вызываете setDropDownViewResource, вы заменяете макет, который вы ранее указали в конструкторе. В вашем случае R.layout.profile_color. SimpleCursorAdapter расширяет ResourceCursorAdapter и в конструкторе устанавливает два макета равными друг другу.

public ResourceCursorAdapter(Context context, int layout, 
    Cursor c, boolean autoRequery) {

    super(context, c, autoRequery);
    mLayout = mDropDownLayout = layout;
    mInflater = (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

Проблема возникает, когда вы вызываете setDropDownViewResource и меняете макет раскрывающегося списка. SimpleCursorAdapter будет продолжать использовать те же привязки идентификатора ресурса, которые вы указали в конструкторе.

Что вам нужно сделать, так это указать макет в конструкторе SimpleCursorAdapter. Я предлагаю изменить ваш код следующим образом:

String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
int[] to = new int[] { android.R.id.text1 }; // from simple_spinner_dropdown_item

SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
        android.R.layout.simple_spinner_dropdown_item, profilesCursor, from, to);

spinnerColor.setAdapter(profilesAdapter);

Чтобы получить желаемый результат.

В основном не используйте метод setDropDownViewResource. Или, если вы это сделаете и измените привязки идентификатора ресурса, вам придется вызвать SimpleCursorAdapter#changeCursorAndColumns; однако это, вероятно, излишне для простого результата, которого вы пытаетесь достичь.

person Rich Schuler    schedule 19.06.2010

ОЧЕНЬ ВАЖНО! Я чуть не рвал на себе волосы, пытаясь понять, почему мой код не работает. Для тех из вас, кто может читать это и ваш код все еще не работает, убедитесь, что int[] to = new int[] {android.R.id.text1}, если вы используя другие макеты Android (например, android.R.layout.simple_spinner_dropdown_item). Код не будет работать, если текстовое представление целочисленного массива не содержится в указанном макете, который вы используете. Во время отладки своего кода я многое изменил и забыл убедиться, что они совпадают. ТАК, если вы определяете свой собственный макет, убедитесь, что вы используете текстовое представление из этого макета.

person Diogenese    schedule 25.04.2011

Кбертикус,

Да, вы правы насчет привязки идентификатора ресурса!!

Однако, если я начал с android.R.layout.simple_spinner_dropdown_item, очевидно, будет отображаться раскрывающийся список, но это некрасиво :-)

String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
int[] to = new int[] { android.R.id.text1 }; // from simple_spinner_dropdown_item

SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
     android.R.layout.simple_spinner_dropdown_item, profilesCursor, from, to);

spinnerColor.setAdapter(profilesAdapter);

альтернативный текст

Но теперь, если я сначала начал с simple_spinner_item, а затем setDropDownViewResource к элементу simple_spinner_dropdown, теперь отображается именно то, что я ищу.

String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
int[] to = new int[] { android.R.id.text1 }; // from simple_spinner_dropdown_item

SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
     android.R.layout.simple_spinner_item, profilesCursor, from, to);

profilesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

spinnerColor.setAdapter(profilesAdapter);

Большое вам спасибо за вашу помощь.

person user370640    schedule 19.06.2010