0

リストビューでチェックボックスがチェックされていないときに、この質問アンドロイドを非表示にする方法を見ました各行にチェックボックスがある リストビューを持っています。が選択されている場合、その lineylayout を非表示にする必要があります。

私はその質問とまったく同じように作成しましたが、最初のチェックボックスでのみ機能します。つまり、最初のチェックボックスをチェックすると機能し、次にlinearlayoutのチェックを外すと非表示になりますが、別のチェックボックスをチェックすると、linearlayoutは常にアダプターに表示されます

public class AdapterFavoriteFoods extends BaseAdapter {

    private ArrayList<Boolean> cb_status = new ArrayList<Boolean>();
    private static LayoutInflater inflater = null;
    private ArrayList<HashMap<String, String>> data;
    Activity activity;
    LinearLayout ll_CancelDone;
    private int checkedBoxs = 0;
    CheckBox[] allCheckBoxes;

    public AdapterFavoriteFoods(Activity activity,
            ArrayList<HashMap<String, String>> data, LinearLayout ll_CancelDone) {
        // TODO Auto-generated constructor stub
        this.activity = activity;
        this.data = data;
        this.ll_CancelDone = ll_CancelDone;
        inflater = (LayoutInflater) this.activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        for (int i = 0; i < data.size(); i++) {
            cb_status.add(false);
        }
        allCheckBoxes = new CheckBox[data.size()];
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View vi = convertView;
        if (vi == null)
            vi = inflater.inflate(R.layout.profile_list_item_checkbox, null);
        TextView tv_name = (TextView) vi
                .findViewById(R.id.tv_profile_list_item_checkbox_title);
        ImageView iv_image = (ImageView) vi
                .findViewById(R.id.iv_profile_list_item_checkbos_image);
        CheckBox cb_selected = (CheckBox) vi
                .findViewById(R.id.cb_profile_list_item_checkbox_checkbox);
        allCheckBoxes[position] = cb_selected;
        cb_selected.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    cb_status.set(position, true);
                    checkedBoxs++;
                    if (ll_CancelDone.getVisibility() == View.GONE)
                        ll_CancelDone.setVisibility(View.VISIBLE);
                } else {
                    cb_status.set(position, false);
                    checkedBoxs--;
                    if (checkedBoxs == 0)
                        ll_CancelDone.setVisibility(View.GONE);
                }
            }
        });
        cb_selected.setChecked(cb_status.get(position));

        HashMap<String, String> hm = data.get(position);
        tv_name.setText(hm.get("name"));
        iv_image.setImageResource(Integer.parseInt(hm.get("image")));
        return vi;
    }
}


  [1]: https://stackoverflow.com/questions/14469590/android-how-to-hide-linearlayout-when-no-checkbox-is-checked-in-listview

Log.d("num", checkedBoxs+"");oncheckchange の else ステートメントでこれを行うと、結果はまだ 1 です。

4

1 に答える 1

1

これは状態を保持する方法ではありません。最も重要なのは、行への参照を保持しないことCheckBoxesです。これを試して:

//...
CheckBox cb_selected = (CheckBox) vi.findViewById(R.id.cb_profile_list_item_checkbox_checkbox);
cb_selected.setChecked(cb_status.get(position));
cb_selected.setOnCheckedChangeListener(new OnCheckedChangeListener() {

     @Override
     public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
          cb_status.set(position, isChecked);
          boolean status = false;
          for (Boolean b : cb_status) {
               if (b) {
                   status = true;
                   break;   
               }
          }  
          ll_CancelDone.setVisibility(status ? View.VISIBLE : View.GONE);
     }
});
于 2013-01-25T16:05:45.987 に答える