1

奇妙なお尻のバグが発生しましたが、その理由がわかりません。「保存」ボタンと、{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;
}
4

0 に答える 0