SpinnerでString型以外のオブジェクトを表示する
Spinnerで扱うオブジェクトは、String型とは限らないんだけど、ぐぐってヒットするサンプルはどれもString型ばかり。
ってことで、String型以外のオブジェクトを扱うための実装方法を調べてみた。
layoutは普通通りに書けばいいみたい。
とりあえず、String型を扱う場合の実装を書いておく。ぐぐればたくさん見つかるけど。
public class SpinnerActivity extends Activity { private Spinner spinner; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContextView(R.layout.spinner); spinner = (Spinner)findViewById(R.id.spinner); ArryAdapteradaper = new ArrayAdapter (this, android.R.layout.simple_spinner_item); adapter.add("abc"); adapter.add("ABC"); adapter.add("123"); spinner.setAdapter(adapter); } }
String型以外のオブジェクトを扱ってみる。たとえばよくあるパターンでPersonとか。
public class Person { private String name; private String twitter; public Person(String name, String twitter) { this.name = name; this.twitter = tiwtter; } public String getName() { return name; } public String getTwitter() { return twitter; } }
単純に置き換えてみると、Person#toString()の内容がSpinnerに表示されてしまう。
public class SpinnerActivity extends Activity { private Spinner spinner; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContextView(R.layout.spinner); spinner = (Spinner)findViewById(R.id.spinner); ArryAdapteradaper = new ArrayAdapter (this, android.R.layout.simple_spinner_item); adapter.add(new Person("きしだなおき", "kis")); adapter.add(new Person("たかふー", "imai78")); adapter.add(new Person("さわださとし", "satoshis")); spinner.setAdapter(adapter); } }
それなりに表示させるために、PersonAdapterを用意する。
public class PersonAdapter extends ArrayAdapter{ @Override public View getView(int position, View convertView, ViewGroup parent) { TextView v = (TextView)super.getView(position, convertView, parent); Person p = getItem(position); v.setText(p.getTwitter() + "/" + p.getName()); return v; } @Override public Vew getDropDownView(int position, View convertView, ViewGroup parent) { TextView v = (TextView)super.getDropDownView(position, convertView, parent); Person p = getItem(position); v.setText(p.getTwitter() + "/" + p.getName()); return v; } }
めんどいので、スクリーンショットなし。