AndroidのSpinnerをコードと名称で管理したい時はAdapterを使おう

Android の Spinner はドロップダウンで項目を選択できる UI です。

Windowsアプリケーションで言うコンボボックスのようなコントロールです。

 

このような入力を行う場合には、表示させる文字列ではなくそれに紐づくコード管理したいというケースが多いのではなでしょうか?

 

そんな時は Adapter を使ってデータと UI のつながりを制御していきます。

コードと名称を管理するクラス

コード 名称
001 項目A
002 項目B
003 項目C

左のようなデータをあつかう場合の事を考えてみます。

Spinner には名称の部分を表示させつつ、内部ではコードを使ってデータを管理しようという想定です。

 

以下がコードと名称を格納するクラスの例です。


public class TestItem {
    public String mCode;
    public String mName;

    public TestItem(String code, String name) {
        mCode = code;
        mName = name;
    }
}

ArrayAdapterを継承したクラスを作る

ArrayAdapter は Spinner で表示するデータを ArrayList で管理してくれる Adapter です。

ArrayAdapter はジェネリック型で宣言されているのでデータ要素の形は自由に設計できます。

public class TestAdapter extends ArrayAdapter<TestItem> {
    public TestAdapter(Context context) {
        super(context, android.R.layout.simple_spinner_item);
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    }

    public TestAdapter(Context context, ArrayList<TestItem> list) {
        super(context, android.R.layout.simple_spinner_item, list);
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = (TextView)super.getView(position, convertView, parent);
        textView.setText(getItem(position).mName);
        return textView;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        TextView textView = (TextView)super.getDropDownView(position, convertView, parent);
        textView.setText(getItem(position).mName);
        return textView;
    }
}

コンストラクター

コンストラクターではレイアウトのリソースを渡せるので独自の見た目にする事も可能です。(3行目)

標準のレイアウトで良い場合には android.R.layout.simple_spinner_item を指定すます。

 

また、ドロップダウン時のレイアウトは setDropDownViewResource メソッドで行います。(4行目)

標準のレイアウトで良い場合には android.R.layout.simple_spinner_dropdown_item を指定します。

getViewメソッド

getView メソッドをオーバーライドして Spinner の表示をカスタマイズします。

super.getView メソッドの戻り値が内容を表示すべき View オブジェクトになります。

標準のレイアウトでは TextView なので TextView.setText メソッドで値をセットしています。

getItem メソッドを使えばコンストラクターで指定した ArratList から値を取得する事が出来ます。

getDropDownViewメソッド

ドロップダウンされた時の表示をカスタマイズします。

getView と同様に getDrowDownView メソッドをオーバーライドして値をセットします。

Activityでの利用例

上記のクラスをActivityで使用する時のサンプルは以下の通りです。

public class MainActivity extends Activity implements AdapterView.OnItemSelectedListener {
    private ArrayList<TestItem> mList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        mList = new ArrayList<TestItem>();
        mList.add(new TestItem("001", "項目A"));
        mList.add(new TestItem("002", "項目B"));
        mList.add(new TestItem("003", "項目C"));

        TestAdapter adapter = new TestAdapter(this, mList);
        Spinner spinner = (Spinner)findViewById(R.id.testspinner);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        switch (parent.getId()) {
            case R.id.testspinner:
                TestItem item = (TestItem)parent.getSelectedItem();
                String code = item.mCode;
                break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
    }
}

Adapterのセット

サンプルでは onCreate で Adapter を生成して Spinner へセットしています。

10~13行目でリスト項目を作成し、そのリストを渡す形で Adapter を生成しています。(15行目)

生成した Adapter は Spinner.setAdapter メソッドでセットします。(17行目)

Spinner選択変更時のイベント

Spinnerが操作され選択項目が変更された時のイベントを受け取りたい場合は、Spinner.setOnItemSelectedListener メソッドでリスナーをセットします。

AdapterView.OnItemSelectedListener インターフェースを実装してイベントを受け取ります。