web-dev-qa-db-ja.com

値を設定し、テキストをAndroidスピナー

スピナーで値を設定してテキストを表示するのに助けが必要です。今のように、私はアレイアダプターによってスピナーにデータを入力しています。

mySpinner.setAdapter(myAdapter);

そして、私が知る限り、これを行った後、同じ位置での表示テキストとスピナーの値は同じです。スピナーから取得できるもう1つの属性は、アイテム上の位置です。

私の場合、.NETにあるドロップダウンボックスのようなスピナーを作成したいと思います。

テキストと値を保持します。

ここで、テキストが表示され、値はバックエンドにあります。したがって、ドロップダウンボックスを変更すると、選択したテキストまたは値のいずれかを使用できます。しかし、Androidスピナーケースでは発生しません。

例えば:

テキスト値
Cat 10
山5
ストーン9
魚14
川13
ロース17

したがって、上記の配列からは、非生物オブジェクトのテキストのみを表示しています。ユーザーがそれらを選択すると、そこに値が表示されます。つまり、Mountainが選択されたときに5が表示されます。

この例が私の質問をもう少し明確にしたことを願っています...

ありがとう

17
kaibuki

ステップ1:テキストと値のペアのデータモデルを作成する

ステップ2:BaseAdapterまたはArrayAdapterを拡張してデータモデルをラップし、getView()をオーバーライドして、Spinner自体に表示したいものを返します。

ステップ3:選択イベントで、位置を使用してデータモデル内の対応するオブジェクトを検索し、値を検索します

Spinnerに表示したいのが、データモデルの各要素のテキスト表現だけである場合は、カスタムAdapterをスキップできます。_ArrayAdapter<YourModelClass>_を使用してtoString()をオーバーライドするだけです。 YourModelClassで、必要な表示テキストを返します。

12
CommonsWare

独自のアダプタクラスを作成したくない場合は、代わりに、スピナーに表示したいものを返すtoStringを持つものにデータをラップすることができます。私は次のようなクラスを使用します:

public class TextItemPair<T> {
    private String text;
    private T item;
    public TextItemPair(String text, T item) {
            this.text = text;
            this.item = item;
    }
    public String getText() {
        return text;
    }
    public T getItem() {
        return item;
    }
    @Override
    public String toString() {
        return getText();
    }
}

そしてスピナーが変わるとき:

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    YourTypeHere t = ((TextItemPair<YourTypeHere>)spinner.getItemAtPosition(position)).getItem();
}
15
alun