0

我想取消选中 customlistview 中的所有复选框。我的适配器工作正常,所以点击按钮

这是写在我的按钮监听器中的

 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个孩子..当向上或向下滚动时,孩子是listview中的项目,显示在视图中,因此显示的listview项目是listview的孩子。 .所以我希望所有孩子都取消选中,但是使用此代码无法正常工作请告诉我该怎么做?

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

一个问题是你在哪里做:

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

您试图获取与“v”关联的复选框,但findViewById()没有这样做。相反,您只需从 XML 创建一个新复选框。

我认为您想要做的是修改基础数据“dcates”,然后调用notifyDataSetChanged()您的适配器。

就像是:

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

listview.getAdapter().notifyDataSetChanged();
于 2013-01-24T20:48:10.697 回答
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 回答