【问题标题】:Selecting all checkboxes of listview in android [duplicate]在android中选择listview的所有复选框[重复]
【发布时间】:2012-11-24 16:10:50
【问题描述】:

我有用于列表视图的自定义 arrayadapter,其中有 5 个视图,包括复选框,在这里我想实现选择列表视图的所有复选框并取消选择所有复选框,我尝试在 oncreate()、@987654323 中使用 getchildat() 方法@, 和onpostcreate 也没有让我走运。如果您能告诉我解决方案,我将不胜感激。

@Override
      public void onPostCreate(Bundle savedInstanceState){
          super.onPostCreate(savedInstanceState);

      Button selectall=(Button) findViewById(R.id.allselect);

      selectall.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            int count = listview.getCount();

            System.out.println("the count is "+count);
            for (int i = 0; i < listview.getLastVisiblePosition() - listview.getFirstVisiblePosition(); i++)  {

                RelativeLayout itemLayout = (RelativeLayout)listview.getChildAt(i);
                CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.chkbx);
                cb.setChecked(true);

            }

        }
    });
  }

数组适配器类

@SuppressWarnings("unchecked")
    public MultipleLeadSyncAdapter(Context context, String[] values,String[] values1,List<Model> qrcode ,String[] values3,String[] values4,String[] values5) {
        super(context, R.layout.multipleselectlist, values1);
        this.context = context;
        this.values = values;
        this.values1 = values1;
        this.list=qrcode;
        this.values3=values3;
        this.values4=values4;
        this.eventid=values5;
    }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    ViewHolder holder =null;
    if (convertView == null) {


            convertView = inflater.inflate(R.layout.multipleselectlist, parent, false);

            holder = new ViewHolder();
            holder.textView1 = (TextView) convertView.findViewById(R.id.multileadfirst_name);

            holder.textView3 = (TextView) convertView
                    .findViewById(R.id.multileadcompany_name);

            holder.rate=(RatingBar) convertView.findViewById(R.id.multileadlistrating);

            holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbx);

            holder.chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag();  
                    list.get(getPosition).setSelected(buttonView.isChecked()); 
                }
            });

            convertView.setTag(holder);
            convertView.setTag(R.id.chkbx,holder.chkbox);
            convertView.setTag(R.id.multileadfirst_name,holder.textView1);
            convertView.setTag(R.id.multileadcompany_name,holder.textView3);
            convertView.setTag(R.id.multileadlistrating,holder.rate);

    }else {
        holder = (ViewHolder) convertView.getTag();
    }


     holder = (ViewHolder) convertView.getTag();


    holder.textView1.setText(values[position]);

    if(values3[position].equals(" ")||values3[position].equals("null")||values3[position].equals("")){

    }else{

        String[] temp=values3[position].split(" ");

    }

    holder.textView3.setText(values1[position]);

    holder.rate.setRating(Float.valueOf(values4[position]).floatValue());

    String s = values[position];
    String ss = values1[position];

    System.out.println(s + ss );


    holder.chkbox.setTag(position);

    //holder.textView3.setText(list.get(position).getName());
    holder.chkbox.setChecked(list.get(position).isSelected());
    String igurl=values[position];
    System.out.println("the imagurl is "+igurl);

    return convertView;



}

class ViewHolder {

    String qrcode,Boothid;
    TextView textView1, textView2, textView3,textView4,textView5;
    RatingBar rate;
    ImageView imageView;
    CheckBox chkbox;

    public String getQrcode() {
        return qrcode;
    }

    public void setQrcode(String qrcode) {
        this.qrcode = qrcode;
    }

    public String getBoothID() {
        return Boothid;
    }

    public void setBoothID(String Boothid) {
        this.Boothid = Boothid;
    }

}

}

【问题讨论】:

    标签: android android-arrayadapter checkbox


    【解决方案1】:

    ListView 只是数据的呈现。数据由Adapter 提供给ListView。话虽如此,我可以解释你做错了什么:

    在您的OnClickListener 中,您正在(取消)检查ListView 本身的View。这意味着数据没有被更改,并且代表此数据的 ListView 不会显示想要的行为。

    一个简单的解决方案是向您的 Model-object 添加一个布尔值,表示检查状态:

    Model {
       boolean isChecked = false;
    
       public void setChecked(boolean checked){
            isChecked = checked;
       }
    
       public boolean isChecked(){
            return isChecked;
       }
    }
    

    当您单击“全选”按钮时,您将简单地切换此布尔值并通知Adapter 他的数据已使用notifyDataSetChanged 方法更改。这将轮到他更新ListView 本身。在伪代码中:

     onClick(..) {
         foreach (model inside my adapter){
             model.setChecked(true);
         }
         listview.getAdapter().notifyDataSetChanged()
     }
    

    最后但同样重要的是,在Adapter 中的getView() 方法中,您可以查看Model 是否被选中并采取相应措施。

    getView(...){
    
       if (listOfModel.get(position).isChecked){
           // do stuff, probably check a CheckBox
       } else {
           // uncheck...
       }
    

    祝你好运!

    【讨论】:

    • +1 对 MVC 的出色解释
    • +100 这个好答案,你为我节省了很多时间。谢谢!
    • 非常有用的解决方案和解释,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多