ViewType を分けています.
まず共通の Item 型を定義し
Java
1abstract class Item {
2 long _id; //getItemId用
3 ViewTypes viewType; //getItemViewType用
4
5 enum ViewTypes {
6 TITLE, DATA
7 }
8
9 abstract View createView(LayoutInflater layoutInflater, ViewGroup parent);
10 abstract void setValues(View convertView);
11}
種類毎に継承してクラスを作ります. (以下はタイトルとデータの場合)
Java
1class TitleItem extends Item {
2 private String title;
3 TitleItem(String title) {
4 viewType = ViewTypes.TITLE; //'タイトル' タイプ
5 this.title = title;
6 }
7 private class ViewHolder { //TitleItem で必要な分
8 TextView textView;
9 }
10 @Override
11 View createView(LayoutInflater layoutInflater, ViewGroup parent) {
12 ViewHolder vh = new ViewHolder();
13 View view = layoutInflater.inflate(R.layout.list_title, parent, false);
14 vh.textView = view.findViewById(R.id.list_title_textView);
15 view.setTag(vh);
16 return view;
17 }
18 @Override
19 void setValues(View convertView) {
20 ViewHolder vh = (ViewHolder) (convertView.getTag());
21 vh.textView.setText(title);
22 }
23}
24class DataItem extends Item {
25 private String data1;
26 private String data2;
27 DataItem(String data1, String data2) {
28 viewType = ViewTypes.DATA; //'データ' タイプ
29 this.data1 = data1;
30 this.data2 = data2;
31 }
32 private class ViewHolder { //DataItem で必要な分
33 TextView textView1;
34 TextView textView2;
35 }
36 @Override
37 View createView(LayoutInflater layoutInflater, ViewGroup parent) {
38 ViewHolder vh = new ViewHolder();
39 View view = layoutInflater.inflate(R.layout.list_data, parent, false);
40 vh.textView1 = view.findViewById(R.id.list_data_textView1);
41 vh.textView2 = view.findViewById(R.id.list_data_textView2);
42 view.setTag(vh);
43 return view;
44 }
45 @Override
46 void setValues(View convertView) {
47 ViewHolder vh = (ViewHolder) (convertView.getTag());
48 vh.textView1.setText(data1);
49 vh.textView2.setText(data2);
50 }
51}
リストビュー用のアダプタはItemのリストを保持しておき、それにTitleItemやDataItemを入れておきます.
Java
1 private List<Item> list = new ArrayList<Item>();
2
3 for(int i=0; i<100; i++) {
4 if(i%5 == 0) {
5 list.add(new TitleItem("group "+(i/5+1)));
6 }
7 list.add(new DataItem("data "+i, "test");
8 }
また, ViewTypeに関するメソッドを2つOverwriteし, getViewでは各Itemのメソッドを呼びます.
Java
1 @Override
2 public int getViewTypeCount() {
3 return Item.ViewTypes.values().length; //Item.ViewTypesに定義された件数
4 }
5 @Override
6 public int getItemViewType(int position) {
7 return list.get(position).viewType.ordinal(); //enumで自動で付けられる番号
8 }
9
10 @Override
11 public View getView(int position, View convertView, ViewGroup parent) {
12 Item item = list.get(position);
13 if(convertView == null) {
14 convertView = item.createView(layoutInflater, parent);
15 }
16 item.setValues(convertView);
17 return convertView;
18 }
Item の種類がもっとあって, でも表示するレイアウトは使いまわせる場合等は, View 関係を Item から ViewTypes に移してもいいかもしれません.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。