
ListViewは情報を一覧表示できるビュー。リスト全体の制御のみ行う。
Adapterは、セルを生成してデータを表示する。セルと、セルに表示するデータの制御のみ行う。
Adapterを指定することでデータを外部から取得し、ListViewに表示できる。
Adapterクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
@Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; //第二引数viewがnullならセルを新規作成 //例えば、最初に6個のセルが必要な場合、6回は第二引数viewはnullで呼ばれる。7,8回目は1,2個目のセルがviewに入るため、第二引数viewはnullじゃないから新規作成しない。 if (view == null){ view = LayoutInflater.from(viewGroup.getContext()) //LayoutInflaterクラスはxmlファイルからビューを生成する機能を提供。from()でインスタンス生成 .inflate(R.layout.custom_cell, viewGroup, false); //inflate()でxmlファイルからビューを生成custom_cell viewHolder = new ViewHolder(); //第一引数で用意されているレイアウトを指定(custom_cell) viewHolder.cardImage = (ImageView) view.findViewById(R.id.card_image); viewHolder.date = (TextView) view.findViewById(R.id.date); //1度取得したviewはviewholderに入れる viewHolder.title = (TextView) view.findViewById(R.id.title); //1度取得したviewはviewholderに入れる viewHolder.detail = (TextView) view.findViewById(R.id.detail); //1度取得したviewはviewholderに入れる view.setTag(viewHolder); //tagはviewの補足情報。任意のオブジェクトを設定できる }else{ //一度取得したviewをtagに保存したので、tagとして保存していたViewHolderから、getTag()で取り出せる。= findViewByIdを使わなくて良い //これはリストビューの表示を高速化するテク。 viewHolder = (ViewHolder) view.getTag(); } //realmからデータを取得する。モデルであるxxxRealmはadapterData(リスト)から取得できる XXXRealm xxxRealm = adapterData.get(i); //get()でセル番号(i)に対応するXXXRealmデータを取り出してセルに表示する SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); //どのような形式で日付(Date型)を文字列に変換するか指定して、SimpleDateFormatクラスのオブジェクトを生成 String formatDate = sdf.format(xxxRealm.date); //生成したオブジェクトのformat()に日付を渡し、フォーマット通りに変換した文字列を取得 viewHolder.date.setText(formatDate); //テキストビューに値をセットする viewHolder.title.setText(xxxRealm.title); //テキストビューに値をセットする viewHolder.cardImage.setImageResource(images[(int) xxxRealm.id % 3]); viewHolder.detail.setText(xxxRealm.detail); return view; //設定が終わったViewを戻り値で戻せば、そのviewがリストビューの行として画面に表示されます。 } |
fa-chevron-circle-rightgetView(int i, View view, ViewGroup viewGroup)
リストビューのセルのデータが必要になるたびに呼ばれ、表示するビューを戻り値として返す。
int i
リストビューのセルの位置を受け取る(行番号。何番目のセルか)
View view
すでに作成済みのセルを表すビューを受け取る。(最初はセルが作られてないからnull。再利用されだしたらnullじゃない)
例えば画面に3個のセルが表示される場合、最初にnullで3回呼ばれ、その後スクロールでセルが必要になれば再利用される。
fa-chevron-circle-rightLayoutInflater
LayoutInflaterクラスはxmlファイルからビューを生成する機能を提供。
from()でインスタンス生成。
inflate()でxmlファイルからビューを生成。第一引数にセル用のビュー。
fa-chevron-circle-rightViewHolder
1 2 3 4 5 6 7 |
//ビューオブジェクトを保持する・ホールドするためのもの → 実はfindViewById()は重い処理だから毎回行いたくない。 private static class ViewHolder {// 一度取得したviewはviewHolderに入れ、セル用のviewのtagのなかに保存してる(L49) ImageView cardImage; TextView date; TextView title; TextView detail; } |
ViewHolderクラスはビューオブジェクトを保持するためのもの。findViewById()は重い処理だから毎回行いたくない。オブジェクトを持たせておけばfindViewById()で毎回viewを取得しなくていい。
一度取得したviewはviewHolderに入れ(viewHolder.date.setText(formatDate);)、セル用のviewのtagのなかに保存(view.setTag(viewHolder);)してる。
アダプターとリストビューを連携
リストビューがのあるアクティビティでこのようなコードを書く
1 2 3 4 5 6 |
// RealmResults<XXXRealm> xxxRealm = mRealm.where(XXXRealm.class).findAll(); //表示したいモデルの一覧 = xxxRealm (realmからデータ(モデル)の全てを取得) XXXRealmAdapter adapter = new XXXRealmAdapter(xxxRealm); //アダプターを生成。この時、アダプターのコンストラクタに渡すのは、表示したいモデルの一覧(xxxRealm) //アダプターとリストビューを連携 //セルを生成してデータを表示するのがアダプターの役目 //ListViewはリスト全体の制御だけ。adapterはセルとセルに表示するデータの制御だけ。役割分担 mListView.setAdapter(adapter); |
setOnItemClickListener()
ListViewのセルをタップした時のリスナー
1 2 3 4 5 6 7 8 9 |
// mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { //リストビューのセルがタップされたらonItemClick()が呼ばれる @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { } }); |
setOnItemLongClickListener()
リストビューのセルを長押しすると呼ばれる。
1 2 3 4 5 |
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { }); |