奇妙なお尻のバグが発生しましたが、その理由がわかりません。「保存」ボタンと、{select1 と select2} の 2 つのオプションを持つドロップダウン スピナーがあります。ユーザーがボタンを押すと、リスト ビューはチェック ボックスの状態を保存する必要があります。ユーザーが「select1」または「select2」に変更すると、保存されたチェックが復元されます。
問題は、たとえば「select1」の下で、チェックボックスの選択を解除し(3つのうち2つ)、保存(ボタンを使用)すると、2つの関数によって2つの異なる結果が得られることです。
ListView lv;
**Log.w(TAG,"saveResourceSettings. count: "+lv.getCheckedItemCount());** <--- "count: 2"
SparseBooleanArray checked =lv.getCheckedItemPositions();
**Log.w(TAG,"saveResourceSettings. checked count: "+checked.size());** <----"checked count: 3" **?????????**
誰が何が悪いのか知っていますか?チェックボックスの選択を解除すると、SparseBooleanArray が更新されていないようです。たとえば、「com.android.gesture.builder」の選択を解除しても、配列に表示されます。
ところで、チェックボックスの状態を保存するためにカスタムデータ構造を使用していますが、これは正常に機能しています。
コンテキストとメソッドを確実に理解するために、コードの一部を投稿します。
packageListView=(ListView) findViewById(R.id.ListView01);
packageListView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,appNames ));
packageListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
spinner = (Spinner) findViewById(R.id.my_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.s_p_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selected = parent.getItemAtPosition(position).toString();
ListView temp=null;
if(selected.equalsIgnoreCase("select1")){
temp= Utils.restoreChecks(packageListView,profile , resource,thisActivity, State.SELECT1);
}
else if(selected.equalsIgnoreCase("select2")){
temp= Utils.restoreChecks(packageListView,profile , resource,thisActivity, State.SELECT2);
}
packageListView=temp;
Log.w(TAG,"REFRESHING");
//packageListView.invalidate();
ArrayAdapter adapt= (ArrayAdapter) packageListView.getAdapter();
adapt.notifyDataSetChanged();
}
});
Button save = (Button) findViewById(R.id.save);
save.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String spinnerSelected =spinner.getSelectedItem().toString();
if(spinnerSelected.equalsIgnoreCase("select1")){
Log.w(TAG,"onCreate. count: "+packageListView.getCheckedItemCount());
AccessFileCmds.saveResourceSettings( packageListView, installedPackageNames, profile, resource,thisActivity, State.SELECT1);
}
else if(spinnerSelected.equalsIgnoreCase("select2")){
Log.w(TAG,"onCreate. count: "+packageListView.getCheckedItemCount());
AccessFileCmds.saveResourceSettings( packageListView, installedPackageNames, profile, resource,thisActivity, State.SELECT2);
}
}
});
解決:
public static int[] getItemPositions(ListView lv){
List<Integer> indexes=new ArrayList<Integer>();
SparseBooleanArray checkedItems = lv.getCheckedItemPositions();
if (checkedItems != null) {
for (int i=0; i<checkedItems.size(); i++) {
if (checkedItems.valueAt(i)) {
String item = lv.getAdapter().getItem(checkedItems.keyAt(i)).toString();
Log.i(TAG,item + " was selected. index: "+checkedItems.keyAt(i));
indexes.add(checkedItems.keyAt(i));
}
}
}
int[] ret=new int[indexes.size()];
for(int i=0;i<indexes.size();i++){
ret[i]=indexes.get(i);
}
return ret;
}