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 インターフェースを実装してイベントを受け取ります。
コメントをお書きください