0

customlistview.my アダプターのチェックボックスをすべてオフにしたいので、ボタンをクリックすると正常に動作します

これは私のボタンリスナーに書かれています

 for(int i = 0; i<listview.getChildCount();i++)
                    {
                     v = listview.getChildAt(i);
                     CheckBox cv =(CheckBox)v.findViewById(R.id.checktitle);
                     if(cv.isChecked())
                     {
                         // cv.setChecked(false);
                         //listview.setItemChecked(i, false);
                           toggle(cv);

                     }

トグル方式で

 public void toggle(CheckBox v)
         {
                 if (v.isChecked())
                 {
                     v.setChecked(false);
                 }
                 else
                 {
                     v.setChecked(true);
                 }
         }

アダプタ

public class customAdapter extends ArrayAdapter {
    View view=null;
    Context context;
    ViewHolder holder;    boolean checkAll_flag = false;
    boolean checkItem_flag = false;
    List<CustomDishMenus> dcates=new ArrayList<CustomDishMenus>();
    public customAdapter(Context context, int textViewResourceId, List objects) {
        super(context, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
        this.context=context;
        this.dcates=objects;
    }
     static class ViewHolder {
            protected TextView text;
            protected CheckBox checkbox;
        }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
         holder = new ViewHolder();
            final CustomDishMenus ords=dcates.get(position);
                LayoutInflater layoutInflater=(LayoutInflater) getContext().getSystemService(getContext().LAYOUT_INFLATER_SERVICE);
                convertView=layoutInflater.inflate(R.layout.tablayout,parent, false);
                if(convertView!=null){

                    holder.text = (TextView) convertView.findViewById(R.id.title);
                    holder.checkbox = (CheckBox) convertView.findViewById(R.id.checktitle);

                    holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                            // TODO Auto-generated method stub
                              int getPosition = (Integer) buttonView.getTag();  
                                dcates.get(getPosition).setSelected(buttonView.isChecked());

                        }
                    });
                     convertView.setTag(holder);
                        convertView.setTag(R.id.title, holder.text);
                        convertView.setTag(R.id.checktitle, holder.checkbox);
                        } else {
                        holder = (ViewHolder) convertView.getTag();

                }
                  holder.checkbox.setTag(position); // This line is important.

                    holder.text.setText(dcates.get(position).getDishName());
                    holder.checkbox.setChecked(dcates.get(position).isSelected());

                return convertView;
    }

このコードの問題は、下にスクロールすると6つの子が表示され、再び6つの子が表示されます。子は、ビューに表示される上下にスクロールするとリストビューの項目であるため、表示されるリストビューの項目はリストビューの子です。 .だから私はすべての子のチェックを外したいのですが、このコードでは機能していません。どうすればよいか教えてください。

4

3 に答える 3

10

これは、ViewGroup のすべての子 CheckBox のチェックを外す簡単な方法です (ListView は ViewGroup を拡張します)。ListView をこのメソッドに渡すだけです。

private void uncheckAllChildrenCascade(ViewGroup vg) {
    for (int i = 0; i < vg.getChildCount(); i++) {
        View v = vg.getChildAt(i);
        if (v instanceof CheckBox) {
            ((CheckBox) v).setChecked(false);
        } else if (v instanceof ViewGroup) {
            uncheckAllChildrenCascade((ViewGroup) v);
        }
    }
}
于 2013-01-24T21:03:33.643 に答える
0

アダプタ(customAdapter)にメソッド呼び出しを含めますsetAllSelected();

setAllSelected () {
    for (int i = 0; i < this.getCount(); i++) {
        AdapterItem info = this.getItem(i);

        // info (add a boolean in you adapter item to store the state of checkbox i.e. isSelected and mark it to true. )
    }
    notifyDataSetChanged();
}

あなたのgetView()。変数 (isSelected) の状態に応じて、チェックボックスを選択または選択解除します。

お役に立てれば。

于 2013-01-24T21:13:39.553 に答える
0

1 つの問題は、どこで行うかです。

CheckBox cv =(CheckBox)v.findViewById(R.id.checktitle);

「v」に関連付けられたチェックボックスを取得しようとしていますが、findViewById()そうではありません。代わりに、XML から新しいチェックボックスを作成するだけです。

あなたがしたいことは、基になるデータ「dcate」を変更してからnotifyDataSetChanged()、アダプターを呼び出すことだと思います。

何かのようなもの:

for (CustomDishMenus menu : dcates)
    menu.setSelected(false);

listview.getAdapter().notifyDataSetChanged();
于 2013-01-24T20:48:10.697 に答える