カスタムアダプターでListView
ListViewを使って、リスト形式の表示を行う場合が多いのだけど、色々とはまってしまった。
ListViewは、単純なテキストをリスト形式するのは簡単なのだけど、ちょっとカスタムしようとする場合は、カスタムしたクラスやレイアウトが必要になってくる。
ネットでも沢山情報があるので、基本的なところはできるのだが・・・
ArrayAdapterを継承したカスタムクラスを作成
CustomAdapter
public class CustomAdapter extends ArrayAdapter { private LayoutInflater layoutInflater_; public CustomAdapter(Context context, int textViewResourceId, List<String> objects) { super(context, textViewResourceId, objects); layoutInflater_ = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = layoutInflater_.inflate(R.layout.rowdata_list, null); } ArrayList<String> item = (ArrayList<String>)getItem(position); TextView textView1; TextView textView2; textView1 = (TextView) convertView.findViewById(R.id.XXX); textView1.setText(item.get(1).toString()); textView2 = (TextView) convertView.findViewById(R.id.XXX); textView2.setText(item.get(2).toString()); return convertView; } }
R.layout.rowdata_listというレイアウトファイルも作成
レイアウトファイル
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/textView1" android:layout_weight="3" android:textColor="@android:color/black" android:textSize="10sp" /> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/textView2" android:layout_weight="1" android:textColor="@android:color/black" android:textSize="10sp" /> </LinearLayout> </LinearLayout>
単純にTextViewが2つ並んでいるレイアウト・・・この部分を変更することで、レイアウトの変更も可能。
使う時は、CustomAdapterを使う。表示するListViewは(R.id.listView1)として指定している。
使う時のコード例
CustomAdapter adapter = new CustomAdapter(getContext(),0,listData);//listDataは表示させるデータ ListView listView = (ListView)findViewById(R.id.listView1); listView.setAdapter(adapter);
カスタムアダプターを使う場合は、色々と用意するものがあるけど、一度作れば使いまわせる。
はまったのは、カスタムアダプターを使わない場合。
カスタムアダプターは、ArrayAdapterを継承している。ArrayAdapterだけでも、単純なものでは使える。
ArrayAdapterでの使用例(失敗パターン)
ArrayAdapter adapter = new ArrayAdapter(getContext(),0,listData); ListView listView = (ListView)findViewById(R.id.listView1); listView.setAdapter(adapter);
CustomAdapterを使わずにArrayAdapterで指定してみた。
ここではまってしまった。テストをしてみるとアプリが落ちてしまう・・・しばらく原因がわからなかった。
ArrayAdapterを調べてみると、2つの引数が間違っていた・・・ここは、レイアウトファイルを指定しなければいけない。
カスタムアダプターと違うのだ。
R.layout.rowdataというファイルを新たに作成
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_bright" android:padding="3dp"> </TextView>
TextViewが1つしかない単純なレイアウト・・・
ArrayAdapterでの使用例(成功パターン)
ArrayAdapter adapter = new ArrayAdapter(getContext(),R.layout.rowdata,listData);
ListView listView = (ListView)findViewById(R.id.listView1);
listView.setAdapter(adapter);
通常の場合でも、レイアウトファイルはいるのか・・・(面倒だ)
次に、カスタムアダプターに戻って、2行や3行のレイアウトはできるだろうか?リストによっては、1つの行の中で色々と表示したい場合がある。複数行にまたがる場合も当然あるだろうし、表示するものが多い場合もある。ウェブで見れるのはアイコンがあったり、2行くらいしなかない。
そこで、複数行のがいけるのか?やってみた。
結果としては、出来た。ファイルが長くなるので貼り付けはしないけど、LinerLayoutの下にLinerLayoutを4つ配置しても表示された。
そのレイアウトファイルをカスタムアダプターの中で読み出してあげればいい。
R.layout.rowdata_listの部分を変更する。もしくは、R.layout.rowdata_list自体を変更してもいい。