ListViewを継承したカスタムビューを作る事って結構多いと思うんだけど、私はこうしているというメモ。
なぜかListViewを更新するたびにAdapterを再生成してるサンプルとかあって混乱したので。
特徴としては、アダプタに更新用のメソッドを作って、カスタムビューにも更新用メソッドを用意しておく。
他のViewの操作と連動してListViewを更新する場合、アダプタの更新内容を与えるだけで更新できる。
思い切ってAdapterやListの生成時には中身を作らなくてもいいような気がする。その方が更新処理を一箇所にまとめられてわかりやすくなる気がする。
あ、SwipeRefreshLayout を継承してるけど、他のListView系のクラスでも同様だと思う。
ListViewのソース。
java
public class HogHogeListView extends SwipeRefreshLayout {
/**
* @param context
* @param attrs
*/
public HogHogeListView(Context context, AttributeSet attrs) {
super(context, attrs);
// リストを作る
listView = new ListView(context);
listView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
//アダプタを作ってListViewに入れる
HogeAdapter adapter = new HogeAdapter(activity,hogeList);
listView.setAdapter(adapter);
// リストを追加
addView(listView);//ListViewのインスタンスを格納する事で、レイアウトの「@android:id/list」に自動的に割り当てられます
setOnRefreshListener(onRefreshListener);//ひっぱった時のリスナ登録
}
/**
* リストビューの更新処理。
*/
public void reflesh(){
HogeAdapteradapter = (HogeAdapter)listView.getAdapter();
adapter.refleshItemList(hogeItemList);
adapter.getFilter().filter(s);//フィルタ実行。ソートもここで実行する。再描画も担当する
}
}
次。アダプタのソース。更新用のメソッドを作っておくこと。
java
public class HogeAdapter extends ArrayAdapter<HogeItem>
public HogeAdapter (Context context, List<HogeItem> list)
{
super(context,R.layout.hoge_list_item);
this.context = context;
this.sourceList = new ArrayList<HogeItem>(list);
}
~ 描画処理とか基本的なのは省略 ~
/**
* ファイルのリストをリフレッシュする
* @param itemList
*/
public void refleshItemList(List<HogeItem> itemList){
sourceList.clear();
sourceList = new ArrayList<HogeItem>(itemList);
}
}