--.--/--.--  /* スポンサーサイト */

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Entry Time --:--  [Category:スポンサー広告] cm tb Top↑

Comment



SUBJECT 
NAME 
BLOG/HP 
PASS 
[管理者に秘密文書を送る場合チェック] 
OK? 

Trackback

スポンサーサイトのトラックバックアドレス
http://lazynote.blog26.fc2.com/tb.php/1000-07d062b9

2013.03/25.Mon  /* Android ListView 複数種類の行レイアウト */

単一レイアウトのListViewは腐るほどサンプルも情報も出てるけど、1つのListViewに複数種類の行レイアウトを設定する方法については全くと言っていい程情報がなかった。キーワード選択ミスかもしれないけど。

という訳で自分用メモ。
参考にしたのは次のサイト。
http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/


1.とりあえずデータクラス作る


コンストラクタでデータ設定する面倒くさがり仕様。
表示するものに合わせて適当に。
getRowTypeメソッドで表示するレイアウトの種類を取得するようにしてみる。


public static class Item{
private String text;
private int type;

public Item(String text, int type){
this.text = text;
this.type = type;
}

public String getText(){
return this.text;
}

public int getRowType(){
return this.type;
}
}


2.BaseAdapter拡張する


複数の行レイアウトを扱えるように手を加える。
コンストラクタはデータクラスのリスト受け取るだけの面倒くさがり仕様。
getItemIdメソッドはよく分かんなかったから引数そのまま返してる。

ここでまずオーバーライドしないといけないのが、getViewTypeCountとgetItemViewType。
getViewTypeCountは扱うレイアウトの数を返値に、getItemViewTypeは使うレイアウトの番号を返す。
言うまでもないけど、引数のpositionは表示する添字的なのをもらうから、getRowTypeメソッド呼んで返す。

んでメインディッシュのgetViewだけど、まず最初のif文で行レイアウトのタイプ判別。
種類増やすならここをswitchに置き換えてやればいい。
2つ目のif文は、引数でもらう行のViewであるconvertViewが作成されているかどうかを判別。
毎回View作るとすごい重くなるらしいから再利用するようになってる。
ここでViewが作られていなかった場合、LayoutInflater使ってお好みのレイアウトを使ってViewを作ってやる。
あとは適当に設定して、Viewを返しておしまい。
スクロールしたりして、画面外→画面内に戻った時もgetViewが呼ばれるから気を付ける。


public static class ArrayAdapterB extends BaseAdapter{

List listArray;


public ArrayAdapterB(List items){
listArray = items;
}

@Override
public int getCount() {
return listArray.size();
}

@Override
public Object getItem(int position) {
return listArray.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public int getViewTypeCount(){
return 2;
}

@Override
public int getItemViewType(int position){
return listArray.get(position).getRowType();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

//Layout判別
if( getItemViewType(position) == 0 ){
//checkedText
if( convertView == null ){
LayoutInflater inflater = LayoutInflater.from(parent.getContext() );
convertView = inflater.inflate(R.layout.checkedtext, parent, false);
}
CheckedTextView textView = (CheckedTextView)convertView.findViewById(R.id.checkedTextView1);
textView.setText( item.getText() );
}else if( getItemViewType(position) == 1){
//NumberPicker
if( convertView == null ){
LayoutInflater inflater = LayoutInflater.from(parent.getContext() );
convertView = inflater.inflate(R.layout.countup, parent, false);

NumberPicker np = (NumberPicker)convertView.findViewById(R.id.numberPicker1);
np.setMaxValue(10);
np.setMinValue(0);
}
TextView textView = (TextView)convertView.findViewById(R.id.textView1);
textView.setText( item.getText() );
}


return convertView;
}

}


3.ListViewにアダプタ渡しておしまい



今作ってるアプリのソースまんまコピペしてるから分かりづらいかもしれないけどまぁいいや。
テスト用に、適当なテストデータ30件作って渡す。


View rootView = inflater.inflate(R.layout.checklist,
container, false);

Random rand = new Random();

int rowType;
for(int i=0;i<30;i++){
rowType = rand.nextInt(1+1);
listArray.add( new Item("CustomAdapter"+i+" rowType="+rowType, rowType ) );
}

ListView listView = (ListView)rootView.findViewById(R.id.listView1);
ArrayAdapterB adapter = new ArrayAdapterB(
listArray);

listView.setAdapter(adapter);



おしまい。
結構適当だから間違いありそうだけど、とりあえず今はいいや。
Entry Time 07:54  [Category:Development] [Comment:0] [Trackback:0] Top↑

Comment



SUBJECT 
NAME 
BLOG/HP 
PASS 
[管理者に秘密文書を送る場合チェック] 
OK? 

Trackback

Android ListView 複数種類の行レイアウトのトラックバックアドレス
http://lazynote.blog26.fc2.com/tb.php/1000-07d062b9
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。