Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Adapter & ListView & ExpandalbeListView

23,104 views

Published on

Published in: Technology, News & Politics
  • Be the first to comment

Adapter & ListView & ExpandalbeListView

  1. 1. Adapter & ListView 2010.10.23
  2. 2. agenda • Adapter - one of the GOF design pattern – • ListView • ExpadableListView
  3. 3. Adapter ● GoF (Gang of Four) によって定義されたデザイン パターンの一つ ● 既存のクラスに修正不要 ● インタフェースを変更可能 ● ListView の adapter は委譲のパターン
  4. 4. ListView ● 1行が1つの View ● チェックボタンやラジオボタンを付けられる
  5. 5. Adapters for List • interface – ListAdapter – SpinnerAdapter – WarrerListAdapter • abstruct class – BaseAdapter – CursorAdapter – ResourceCursorAdapter • class – ArrayAdapter – HeaderViewListAdapter – SimpleAdapter – SimpleCursorAdapter
  6. 6. SimpleAdapter
  7. 7. SimpleAdapter • What is – static data を XML ファイルで 定義された TextView や ImageView に紐づけるための簡 単な adapter • What views can use? – TextView – ImageView – ChackedTextView • Way to bind 1. SimpleAdapter.ViewBinder が セットされていたら、このクラ スの setViewValue メソッドが 呼ばれる 2. 1. が false の場合、setTextView が呼ばれる 3. 2. が false の場 合、setImageView が呼ばれる * setViewBinder() で独自の SimpleAdapter.ViewBinder を セットすれば、TextView, ImageView 以外の View を使え る
  8. 8. SimpleAdapter • Constructors – parameters • context : SimpleAdapter が紐付く View が動作する Context this, getApplicationContext() など • data : Map の List. List の 1 エントリ が ListView の 1行に相当する Map は from で指定した各文字列がキーになった data を持ってなければならない • resource : ListView の 1行のレイアウト XML ファイルの Resource ID このレイアウトには、 to で指定した各 Id の View が 含まれていなければならない • from : 各 View に紐づける Map data のキー • to : from パラメータの各 data を紐づける View の Id SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
  9. 9. SimpleAdapter • Constructors SimpleAdapter( this, data, R.layout.list_item, from, to) res/layout/list_item.xml <LinearLayout android:orientation=“horizontal” > <TextView android:id=“@+id/textview1” /> <TextView android:id=“@+id/textview2” /> </LinearLayout> int[] to = {R.id.textview1, R.id.textview2}; textview2 textview1
  10. 10. SimpleAdapter • Constructors SimpleAdapter( this, data, R.layout.list_item, from, to) static final List<HashMap<String, String> data = Arrays.asList( new HashMap<String, String>() { put(“Title”, “ 吾輩は猫である”); put(“Author”, “夏目漱石”); }, … new HashMap<String, String>() { put(“Title”, “ 走れメロス”); put(“Author”, “太宰治”); } ); String[] from = {“Title”, “Author”}; textview2 textview1
  11. 11. SimpleAdapter • Constructors SimpleAdapter( this, data, R.layout.list_item, from, to) textview2 textview1
  12. 12. SimpleAdapter • Constructors SimpleAdapter( this, data, R.layout.list_item, from, to) res/layout/list_item.xml <LinearLayout android:orientation=“horizontal” > <ImageView android:id=“@+id/imageview1” /> <ImageView android:id=“@+id/imageview2” /> </LinearLayout> int[] to = {R.id.imageview1, R.id.imageview2}; imageview2 imageview1
  13. 13. SimpleAdapter • Constructors static final List<HashMap<String, Integer> data = Arrays.asList( new HashMap<String, Integer>() { put(“Icon1”, R.drawable.alermclock); put(“Icon2”, R.id.bookopen); }, … new HashMap<String, Integer>() { put(“Icon1”, R.id.calculator); put(“Icon2”, R.id.camera); } ); String[] from = {“Icon1”, “Icon2”}; imageview2 imageview1 SimpleAdapter( this, data, R.layout.list_item, from, to)
  14. 14. SimpleAdapter • Constructors imageview2 imageview1 SimpleAdapter( this, data, R.layout.list_item, from, to)
  15. 15. SimpleAdapter ● Notes ● 異なるデータ型を一緒に含むことができない ● 文字列(String)と resource ID(Integer)を一緒にできない ● データ型を Object にすればできます!! imageview textview static final List<HashMap<String, Object> data = Arrays.asList( new HashMap<String, String>() { put(“Icon”, R.id.soseki); put(“Author”, “夏目漱石”); }, … new HashMap<String, String>() { put(“Icon”, R.id.dazai); put(“Author”, “太宰治”); } );
  16. 16. SimpleCursorAdapter
  17. 17. SimpleCursorAdapter • What is – Cursor から取得したカラムを XML ファイルで定義された TextView や ImageView に紐づけ るための簡単な adapter • What views can use? – TextView – ImageView – ChackedTextView • Way to bind 1. SimpleAdapter.ViewBinder が セットされていたら、このクラ スの setViewValue メソッドが 呼ばれる 2. 1. が false の場合、setTextView が呼ばれる 3. 2. が false の場 合、setImageView が呼ばれる * setViewBinder() で独自の SimpleAdapter.ViewBinder を セットすれば、TextView, ImageView 以外の View を使 える
  18. 18. SimpleCursorAdapter • Constructors – parameters • context : SimpleAdapter が紐付く View が動作する Context this, getApplicationContext() など • c : データベースの cursor cursor がまだ使えないときは null でも OK • resource : ListView の 1行のレイアウト XML ファイルの Resource ID このレイアウトには、 to で指定した各 Id の View が 含まれていなければならない • from : 各 View に紐づける cursor data の column name cursor がまだ使えないときは null でも OK • to : from パラメータの各 data を紐づける View の Id SimpleAdapter( Context context, int resource, Cursor c, String[] from, int[] to)
  19. 19. SimpleCursorAdapter ● Notes ● List<? extends Map<String, ?>> data が Cursor c になった だけで、 SimpleAdapter と同じ ● もちろん、異なるデータ型を含むことができる imageview textview できる! ^ ^
  20. 20. ArrayAdapter
  21. 21. ArrayAdapter • What is – 任意の Object の配列を ListView に紐づけるための adapter • What views can use? – TextView (デフォルト) – 任意の View • Way to bind 1. デフォルトは 1行 = TextView 2. id を指定すれば、レイアウト 内の任意の TextView に紐づけ 可能 3. 任意の Object の配列を紐づけ る場合、toString() を override すれば、その戻り値が TextView に入る 4. ImageView など toString() を 戻り値がふさわしくない場合 、getView(int, View, ViewGroup) を override する
  22. 22. ArrayAdapter • Constructors – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • resource: TextView が1つだけ含まれるレイアウトファイルの resource Id レイアウトファイルの root view が TextView でなければならない ArrayAdapter(Context context, int resource)
  23. 23. ArrayAdapter • Constructors ArrayAdapter(this, R.layout.list_item) Note List の 1行は TextView になる 紐づけるデータは add(T object) で追加する textview
  24. 24. ArrayAdapter • Constructors – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • resource : ListView の 1行のレイアウト XML ファイルの Resource ID このレイアウトには、 textViewResourceId で指定した Id の TextView が 含まれていなければならない • textViewResourceId : TextView の resource Id ArrayAdapter(Context context, int resource, int textViewResourceId)
  25. 25. ArrayAdapter • Constructors ArrayAdapter(this, R.layout.list_item, R.id.textview) Note List の 1行のどこかに adapter と紐付く TextView が含まれる 紐づけるデータは add(T object) で追加する textview
  26. 26. ArrayAdapter • Constructors – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • resource : TextView が1つだけ含まれるレイアウトファイルの resource Id レイアウトファイルの root view が TextView でなければならない • Object : 各 View に紐づける T クラス (String, 独自クラスなど) の配列 toString() の戻り値が TextView に入れられる ArrayAdapter(Context context, int resource, T[] Object)
  27. 27. ArrayAdapter • Constructors ArrayAdapter(this, R.layout.list_item, data) String[] data = {“夏目漱石”, “太宰治”, … }; Note List の 1行は TextView になる TextView に表示される文字は toString() の戻り値 textview
  28. 28. ArrayAdapter • Constructors – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • resource : ListView の 1行のレイアウト XML ファイルの Resource ID このレイアウトには、 textViewResourceId で指定した Id の TextView が 含まれていなければならない • textViewResrouceId : TextView の resource Id • Object : 各 View に紐づける T クラス (String, 独自クラスなど) の配列 toString() の戻り値が TextView に入れられる ArrayAdapter(Context context, int resrouce, int textViewResourceId, T[] Object)
  29. 29. ArrayAdapter • Constructors ArrayAdapter(this, R.layout.list_item, R.id.textview, data) String[] data = {“夏目漱石”, “太宰治”, … }; Note List の 1行のどこかに adapter と紐付く TextView が含まれる TextView に表示される文字は toString() の戻り値 textview
  30. 30. ArrayAdapter • Constructors – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • resource : TextView が1つだけ含まれるレイアウトファイルの resource Id レイアウトファイルの root view が TextView でなければならない • Object : 各 View に紐づける T クラス (String, 独自クラスなど) の List toString() の戻り値が TextView に入れられる ArrayAdapter(Context context, int resource, List<T> Object)
  31. 31. ArrayAdapter • Constructors ArrayAdapter(this, R.layout.list_item, data) List<String> data = new ArrayList<String>(); data.add (“夏目漱石”); data.add(“太宰治”); Note List の 1行は TextView になる TextView に表示される文字は toString() の戻り値 textview
  32. 32. ArrayAdapter • Constructors – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • resource : ListView の 1行のレイアウト XML ファイルの Resource ID このレイアウトには、 textViewResourceId で指定した Id の TextView が 含まれていなければならない • textViewResrouceId : TextView の resource Id • Object : 各 View に紐づける T クラス (String, 独自クラスなど) の List toString() の戻り値が TextView に入れられる ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> Object)
  33. 33. ArrayAdapter • Constructors ArrayAdapter(this, R.layout.list_item, R.id.textview, data) List<String> data = new ArrayList<String>(); data.add (“夏目漱石”); data.add(“太宰治”); Note List の 1行のどこかに adapter と紐付く TextView が含まれる TextView に表示される文字は toString() の 戻り値 textview
  34. 34. ArrayAdapter • Get static adapter – parameters • context : ArrayAdapter が紐付く View が動作する Context this, getApplicationContext() など • textArrayResourceId : 文字列の配列が定義されている resource Id res/values/arrays.xml など • resource : TextView が1つだけ含まれるレイアウトファイルの resource Id レイアウトファイルの root view が TextView でなければならない – Returns • static ArrayAdapter<CharSequence> ArrayAdapter.createFromResource(Context context, int textArrayResrouceId, int resource)
  35. 35. ArrayAdapter • Get static adapter ArrayAdapter(this, R.array.authors, R.layout.list_item, data) res/values/arrays.xml <string-array name=“authors”> <item>夏目漱石</item> <item>太宰治</item> </string-array> Note List の 1行は TextView になる TextView に表示される文字は resource の string- array で定義した各文字列 textview
  36. 36. extends ArrayAdapter
  37. 37. extends ArrayAdapter • Point – getView() を Override する – ViewHolder を使う • Example – ImageView and TextView – ListView に紐づけるデータ用のクラスを定義 – ViewHolder 用のクラスを定義 class bindData { String text; int imageResourceId; } static class ViewHolder { TextView textView; ImageView imageView; }
  38. 38. extends ArrayAdapter public class MyAdapter extends ArrayAdapter<bindData> { private LayoutInflater inflater; public MyAdapter(Context context, List<ImageAndString> objects) { super(context, 0, objects); this.inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } • Point – View を生成するための LayoutInflater を取得する – 親クラス (ArrayAdapter) のコンストラクタの textViewResoruceId には 0 を渡す • Example – ImageView and TextView – getSystemService(Context.LAYOUT_INFLATER_SERVICE) を使う
  39. 39. extends ArrayAdapter @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.list_item, parent, false); holder = new ViewHolder(); holder.textView = (TextView) convertView.findViewById(R.id.textview); holder.imageView = (ImageView) convertView.findViewById(R.id.imageview); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } bindData data= getItem(position); holder.textView.setText(data.text); holder.imageView.setImageResource(data.imageResourceId); return convertView; } }
  40. 40. extends ArrayAdapter ● Point ● 複雑なレイアウトでもOK ● いろんな View に別々の型のデータを紐づけられる ● データ用のクラスの List (or 配列)の要素数と ListView の 行数は同じ imageview textview
  41. 41. extends BaseAdapter
  42. 42. extends BaseAdapter ● Point ● 複雑なレイアウトでもOK ● データのリストを管理を自分でできる
  43. 43. ExpandableListView
  44. 44. Adaptears for ExpandableList • public interface – ExpandableListAdapter – HeterogeneousExpandableList • public abstruct class – BaseExpandableListAdapter – CursorTreeAdapter – ResourceCursorTreeAdapter • public class – SimpleExpandableListAdapter
  45. 45. SimpleExpandableListAdapter
  46. 46. SimpleExpandableListAdapter • Constructors – parameters • groupData, groupLayout, groupFrom, groupTo : group (= とじたとき) に関する引数 SimpleAdapter と同じ • childData, childLayout, childFrom, childTo : Child (= 開いたとき) に関する引数 SimpleAdapter と同じ SimpleExpandableListAdapter(Context context, List<? extendsMap<String, ?>> groupData, int groupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo)
  47. 47. SimpleExpandableListAdapter • Constructors SimpleExpandableListAdapter(this, groupData, R.layout.list_item1, groupFrom, groupTo, childData, R.layout.list_item2, childFrom, childTo) res/layout/list_item1.xml <LinearLayout android:orientation=“horizontal” > <ImageView /> <TextView android:id=“@+id/textview” /> </LinearLayout> int[] groupTo = {R.id.textview}; textview
  48. 48. SimpleExpandableListAdapter • Constructors static final List<HashMap<String, String> groupData = Arrays.asList( new HashMap<String, String>() { put(“Author”, “夏目漱石”); }, … new HashMap<String, String>() { put(“Author”, “太宰治”); } ); String[] groupFrom = {“Author”}; SimpleExpandableListAdapter(this, groupData, R.layout.list_item1, groupFrom, groupTo, childData, R.layout.list_item2, childFrom, childTo) textview
  49. 49. SimpleExpandableListAdapter • Constructors res/layout/list_item2.xml <LinearLayout android:orientation=“horizontal” > <TextView android:id=“@+id/textview1” /> <TextView android:id=“@+id/textview2” /> </LinearLayout> int[] childTo = {R.id.textview1, R.id.textview2}; textview2 textview1 SimpleExpandableListAdapter(this, groupData, R.layout.list_item1, groupFrom, groupTo, childData, R.layout.list_item2, childFrom, childTo)
  50. 50. SimpleExpandableListAdapter • Constructors List<List<HashMap<String, String> childData = new ArrayList<List<HashMap<String, String>(); static final List<HashMap<String, String> firstChildData = Arrays.asList( new HashMap<String, String>() { put(“Title”, “吾輩は猫である”); put(“Date”, “1905年”); }, … new HashMap<String, String>() { put(“Title”, “坊ちゃん”); put(“Date”, “1906年”); } ); childData.add(firstChildData); String[] childFrom = {“Title”, “Date”}; textview2textview2 textview1 SimpleExpandableListAdapter(this, groupData, R.layout.list_item1, groupFrom, groupTo, childData, R.layout.list_item2, childFrom, childTo)
  51. 51. SimpleExpandableListAdapter • Constructors SimpleExpandableListAdapter(this, groupData, R.layout.list_item1, groupFrom, groupTo, childData, R.layout.list_item2, childFrom, childTo) textview2 textview1
  52. 52. SimpleExpandableListAdapter ● Notes ● 異なるデータ型を一緒に含むことができない ● 文字列(String)と resource ID(Integer)を一緒にできない ● データ型を Object にすればできます!! imageview textview List<List<HashMap<String, Object> childData = new ArrayList<List<HashMap<String, Object>(); static final List<HashMap<String, Object> firstChildData = Arrays.asList( new HashMap<String, String>() { put(“Icon”, R.id.waganeko); put(“Title”, “吾輩は猫である”); }, … new HashMap<String, String>() { put(“Icon”, R.id.bochyan); put(“Title”, “坊ちゃん”); } ); childData.add(firstChildData);
  53. 53. extends BaseExpandableListAdapter
  54. 54. extends BaseExpandableListAdapter ● Point ● 複雑なレイアウトでもOK ● データのリストを管理を自分でできる

×