5

このサンプルコードを使用して、スピナーにデータを入力しています。データはデータベースから読み取られます。選択範囲が正しく表示されます。この場合、「緑」と「赤」が表示されます。

    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を使用するように変更した場合。スピナーテキストが消えました。

    // 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の有無のスナップショットを参照してください。ここに画像の説明を入力してください

私が見逃すかもしれない何か?

4

3 に答える 3

3

さて、何が起こっているのかというと、呼び出しsetDropDownViewResourceているときに、コンストラクターで以前に指定したレイアウトを置き換えているということです。あなたの場合R.layout.profile_colorSimpleCursorAdapter拡張ResourceCursorAdapterし、コンストラクターで2つのレイアウトを互いに等しく設定します。

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、コンストラクターで指定したものと同じリソースIDバインディングを引き続き使用します。

あなたがすべきことは、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基本的にこの方法は使用しないでください。または、そうして、リソースIDバインディングを変更した場合は、SimpleCursorAdapter#changeCursorAndColumns;を呼び出す必要があります。ただし、これは、達成しようとしている単純な結果にはおそらくやり過ぎです。

于 2010-06-19T04:35:19.917 に答える
2

非常に重要です!コードが機能しない理由を理解しようとして、髪の毛をほとんど引き裂きました。これを読んでいてコードがまだ機能していない場合は、他のAndroidレイアウト(このようandroid.R.layout.simple_spinner_dropdown_itemとして)。使用している指定されたレイアウトに整数配列textviewが含まれていない場合、コードは機能しません。コードをデバッグしている間、私は多くのことを変更し、これらが一致することを確認するのを忘れました。したがって、独自のレイアウトを定義する場合は、必ずそのレイアウトのテキストビューを使用してください。

于 2011-04-25T19:58:54.470 に答える
0

Qberticus、

はい、あなたはリソースIDバインディングについて正しいです!!

ただし、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_itemsetDropDownViewResourceから始めて、次に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);

手伝ってくれてどうもありがとう。

于 2010-06-19T13:00:49.117 に答える