いろいろな方法があるようですが、ArrayAdapterを拡張する方法です。
まず内部的な値(Key)と表示する値(Value)のペアとなるクラスを作成しました。
Androidにはキーと値のペアを表すPair<T,T>クラスがあるのですが、 キーはInteger、値はStringという場合がほとんどで、Pair<Integer,String>とイチイチ書くのが面倒なので作っておきます。
このクラスはなくてもいいです。
その場合はKeyValuePairを使用している箇所はPair<Integer,String>と読み替えてください。
public class KeyValuePair extends Pair<Integer,String> { public KeyValuePair(Integer key, String value) { super(key, value); } public Integer getKey(){ return super.first; } public String getValue(){ return super.second; } }
次にArrayAdapterを継承しKeyValuePairArrayAdapterクラスを作成します。
getViewメソッドでスピナー部分に表示する値を返すようにします。
getDropDownViewメソッドでスピナーのドロップダウンに表示する値を返すようにします。
getPositionメソッドでスピナーに設定した値リストから、内部で使用する値(キー)の要素番号を返すようにします。
public class KeyValuePairArrayAdapter extends ArrayAdapter<KeyValuePair> { /** * @brief コンストラクタ * @param context * @param textViewResourceId */ public KeyValuePairArrayAdapter(Context context, int textViewResourceId) { super(context, textViewResourceId); } /** * @brief コンストラクタ * @param context * @param textViewResourceId * @param list */ public KeyValuePairArrayAdapter(Context context, int textViewResourceId, List<KeyValuePair> list) { super(context, textViewResourceId, list); } /** * @brief Spinerに表示するViewを取得します。 */ @Override public View getView(int position, View convertView, ViewGroup parent) { TextView view = (TextView) super.getView(position, convertView, parent); view.setText(getItem(position).getValue()); return view; } /** * @brief Spinerのドロップダウンアイテムに表示するViewを取得します。 */ @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { TextView view = (TextView) super.getDropDownView(position, convertView, parent); view.setText(getItem(position).getValue()); return view; } /** * @brief keyに一致するインデックスを取得します。 * @param key * @return */ public int getPosition(int key){ int position = -1; for (int i = 0 ; i < this.getCount(); i++){ if (this.getItem(i).getKey() == key) { position = i; break; } } return position; } }
実際に使用する際のコードです。
まずはベタっとした場合
public class MainActivity extends Activity { private Spinner _spinner = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //スピナー _spinner = (Spinner)this.findViewById(R.id.spinner1); _spinner.setOnItemSelectedListener(Spinner1_OnItemSelectedListener); //スピナーのドロップダウンアイテムを設定 KeyValuePairArrayAdapter adapter = new KeyValuePairArrayAdapter(this, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); adapter.add(new KeyValuePair(1,"One")); adapter.add(new KeyValuePair(2,"Two")); adapter.add(new KeyValuePair(3,"Three")); _spinner.setAdapter(adapter); //キーが2の値を選択する Integer selectKey = 2; _spinner.setSelection(adapter.getPosition(selectKey)); } /** * @brief スピナーのOnItemSelectedListener */ private OnItemSelectedListener Spinner1_OnItemSelectedListener = new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { KeyValuePair item = (KeyValuePair)_spinner.getSelectedItem(); Toast.makeText(MainActivity.this, item.getKey().toString(), Toast.LENGTH_LONG).show(); } public void onNothingSelected(AdapterView<?> arg0) { } }; }
次はデータベースのデータの場合
public class MainActivity extends Activity { private Spinner _spinner = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //スピナー _spinner = (Spinner)this.findViewById(R.id.spinner1); _spinner.setOnItemSelectedListener(Spinner1_OnItemSelectedListener); //スピナーのドロップダウンアイテムを設定 List<KeyValuePair> list = getSpinnerData(); KeyValuePairArrayAdapter adapter = new KeyValuePairArrayAdapter(this, android.R.layout.simple_spinner_item, list); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); _spinner.setAdapter(adapter); //キーが2の値を選択する Integer selectKey = 2; _spinner.setSelection(adapter.getPosition(selectKey)); } /** * @brief スピナーデータを取得します。 * @return */ private List<KeyValuePair> getSpinnerData(){ StringBuilder sql = new StringBuilder(); sql.append(" SELECT Code, Name"); sql.append(" FROM MYTABLE"); List<KeyValuePair> list = new ArrayList<KeyValuePair>(); DatabaseHelper dbhelper = new DatabaseHelper(this); SQLiteDatabase db = dbhelper.getReadableDatabase(); try { Cursor cursor = db.rawQuery(sql.toString(), null); cursor.moveToFirst(); try { while (cursor.moveToNext()){ list.add(new KeyValuePair(cursor.getInt(0),cursor.getString(1))); } } finally { cursor.close(); } } finally { db.close(); } return list; } /** * @brief スピナーのOnItemSelectedListener */ private OnItemSelectedListener Spinner1_OnItemSelectedListener = new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { KeyValuePair item = (KeyValuePair)_spinner.getSelectedItem(); Toast.makeText(MainActivity.this, item.getKey().toString(), Toast.LENGTH_LONG).show(); } public void onNothingSelected(AdapterView<?> arg0) { } }; }
最後にリソースで定義したデータの場合
リソース
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- Spinner1のドロップダウンアイテム --> <string-array name="spinner1_item1"> <item name="key">1</item> <item name="value">One</item> </string-array> <string-array name="spinner1_item2"> <item name="key">2</item> <item name="value">Two</item> </string-array> <string-array name="spinner1_item3"> <item name="key">3</item> <item name="value">Three</item> </string-array> <array name="spinner1_data"> <item>@array/spinner1_item1</item> <item>@array/spinner1_item2</item> <item>@array/spinner1_item3</item> </array> </resources>アクティビティ
public class MainActivity extends Activity { private Spinner _spinner = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //スピナー _spinner = (Spinner)this.findViewById(R.id.spinner1); _spinner.setOnItemSelectedListener(Spinner1_OnItemSelectedListener); //スピナーのドロップダウンアイテムを設定 List<KeyValuePair> list = getSpinnerData(); KeyValuePairArrayAdapter adapter = new KeyValuePairArrayAdapter(this, android.R.layout.simple_spinner_item, list); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); _spinner.setAdapter(adapter); //キーが2の値を選択する Integer selectKey = 2; _spinner.setSelection(adapter.getPosition(selectKey)); } /** * @brief スピナーデータを取得します。 * @return */ private List<KeyValuePair> getSpinnerData(){ List<KeyValuePair> list = new ArrayList<KeyValuePair>(); Resources res = getResources(); TypedArray spinner1_data = res.obtainTypedArray(R.array.spinner1_data); for (int i = 0; i < spinner1_data.length(); ++i) { int id = spinner1_data.getResourceId(i, -1); if (id > -1) { String[] item = res.getStringArray(id); list.add(new KeyValuePair(Integer.valueOf(item[0]), item[1])); } } spinner1_data.recycle(); return list; } /** * @brief スピナーのOnItemSelectedListener */ private OnItemSelectedListener Spinner1_OnItemSelectedListener = new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { KeyValuePair item = (KeyValuePair)_spinner.getSelectedItem(); Toast.makeText(MainActivity.this, item.getKey().toString(), Toast.LENGTH_LONG).show(); } public void onNothingSelected(AdapterView<?> arg0) { } }; }
0 件のコメント:
コメントを投稿