Android - раскрывающийся текст / выбор Spinner не отображается - PullRequest
5 голосов
/ 19 июня 2010

Я использую этот пример кода для заполнения 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 ниже: enter image description here

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

Ответы [ 3 ]

3 голосов
/ 19 июня 2010

Хорошо, что происходит, когда вы звоните 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; однако, это, вероятно, излишне для простого результата, которого вы пытаетесь достичь.

2 голосов
/ 25 апреля 2011

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

0 голосов
/ 19 июня 2010

Qberticus,

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

Однако, если я начал с 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);

alt text http://www.freeimagehosting.net/uploads/c2647bd57d.gif

Но теперь Если я сначала начал с simple_spinner_item , затем setDropDownViewResource до 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_item, profilesCursor, from, to);

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

spinnerColor.setAdapter(profilesAdapter);

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

...