2011年12月4日日曜日

Androidプログラミングメモ 2011/12/4

simple_list_item_multiple_choiceのListViewを使用していて
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
などとした時にチェックされた物を処理したい場合に
getCheckedItemPositions()を使おうと思ったんだけどどうも違うみたい。
正しくは「チェックしたものがある時にすべてのリストを返す」物みたい。
例えば以下の直感コードではうまく動かない。

SparseBooleanArray positions = lv.getCheckedItemPositions();
for (int i = 0; i < positions.size(); i++) {
    if(positions.valueAt(i)){
        data.remove(positions.keyAt(i));
    }
}

一個だけだとうまく行く時もあるけど二個以上のチェックに失敗したり
データを追加したりした後のデータ削除などすると目もあてられない。
SparseBooleanArrayのsize()はListViewの最大値を返してくれるし
keyAt(i)なんかはよくわからない数値を出してくるし。

ListViewが何百もあった場合は結構つらそうだけど以下のように地道に
処理した方が無難みたい。

for (int ii = 0; ii < lv.getChildCount(); ii++) {
    CheckedTextView vv = (CheckedTextView)lv.getChildAt(ii);
    if (vv.isChecked()) {
        //チェックしたものの作業
        data.remove(ii);
    }
}

また、これはAndroidだけではない事だけどデバッグなどで
データを見たいからと言って

Log.v(getClass().getSimpleName(), "values: " + data.toString());
data.remove(ii);
Log.v(getClass().getSimpleName(), "values: " + data.toString());

とかするとデータの無いものを見たりしようとするので
馬鹿な真似はしないように。

0 件のコメント:

コメントを投稿