listView.getCheckedItemPositions()はListViewで選択されたアイテムのみを取得できるように見えますが実際に返す値は「一度でもチェックされたアイテム」です。つまり,一度チェックしてからチェックを外してもアイテムを返してしまいます。
ここではサンプルとしてListViewに表示された「月、火、水、木、金、土、日」がチェック(複数選択可)され,Buttonが押された時にチェックされているPositionとValueを取得するサンプルを記します。
.xml
―――――――――――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:text="Button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/button1"
android:onClick="onClick_Button"></Button>
<ListView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
< !-- choiceMode属性をmultipleChoiceで複数選択可になる -- >
android:choiceMode="multipleChoice"
android:id="@+id/ListView"></ListView>
</LinearLayout>
―――――――――――――――――――――――――――――
.java(重用なソース抜粋)
―――――――――――――――――――――――――――――
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
public class ListViewMultipleChoiceModeActivity extends Activity{
private ListView listView;
private final String[] listSample = {"月","火","水","木","金","土","日"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.ListView);
// アダプタの作成
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice,listSample);
listView.setAdapter(adapter);
}
public void onClick_Button(View view){
// ここのgetCheckedItemPositions()が曲者で一度チェックされたアイテムが返される
// つまりチェックボックスのチェックを外してもアイテムとして返される(言葉と矛盾している)
SparseBooleanArray checked = listView.getCheckedItemPositions();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < checked.size(); i++) {
// (言葉と矛盾しているところを補正します)
if(checked.valueAt(i)){
int key = checked.keyAt(i);
sb.append("POSITION:"+checked.keyAt(i)+" "+"VALUE:"+listSample[i]+"\n");
}
}
Toast.makeText(getApplicationContext(), sb, Toast.LENGTH_SHORT).show();
}
}
―――――――――――――――――――――――――――――
実行すると
左図の様に表示されるかと思います。ここで複数の選択してボタンを押してButtonを押すとトーストでPOSITIONとVALUEが正しく表示されていることが分かります。
この方法だとチェックを外せばもちろん表示されなくなります。
実行後の画面 |
複数選択してボタンを押した画面 |
sb.append("POSITION:"+checked.keyAt(i)+" "+"VALUE:"+listSample[i]+"\n");
返信削除とありますが、
listSample[key]ではないでしょうか?
また、画像の右のボタン状態とVALUEの値が異なっています。
報告でした。