如何在ListView中限制复选框的选择?

4

朋友们,

我想在Android ListView中限制复选框的选择,例如只能选择3个复选框,否则应该显示错误消息。

用户可以从列表中选择任意三个复选框。有人能指导我如何实现吗?这是我的适配器:

public class AdapterContacts extends BaseAdapter  {

    private LayoutInflater mInflater;

    public Context context;
    public static List<myContacts> contacts;

    public AdapterContacts(Context context,List<myContacts> list) {
      mInflater = LayoutInflater.from(context);
      this.context = context;
      contacts= list;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {

      ViewHolder holder;

      if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_contacts, null);
        holder = new ViewHolder();
        holder.contactName = (TextView) convertView.findViewById(R.id.contactName);
        holder.contactNumber = (TextView) convertView.findViewById(R.id.contactNumber);
        holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
        convertView.setTag(holder);

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

      myContacts contact = getItem(position);
      holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton checkboxView, boolean isChecked) {
                 myContacts c = (myContacts) checkboxView.getTag();
                 c.setSelected(isChecked);
                 // to put that check of selection limit with error


            }
        });


      holder.checkBox.setTag(contact);
      holder.checkBox.setChecked(contact.isSelected());



      holder.contactName.setText(contact.getContactName());
      holder.contactNumber.setText(contact.getPhoneNumber());

        return convertView;

        }

    @Override
    public int getCount() {
        return contacts.size();
    }

    @Override
    public myContacts getItem(int position) {
        return contacts.get(position);
    }

    @Override
    public long getItemId(int arg0) {
        return 0;
    }


    class ViewHolder {
        TextView contactName;
        TextView contactNumber;
        CheckBox  checkBox;
      }




}

任何帮助都将不胜感激。
5个回答

8

最终我解决了这个问题 :) globalInc是一个全局变量,其默认值为0。

holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
      {

            @Override
            public void onCheckedChanged(CompoundButton checkboxView, boolean isChecked) 
            {
                 myContacts c = (myContacts) checkboxView.getTag();

                 if(isChecked)
                 {
                     globalInc++;
                 }
                 else if(!isChecked)
                 {
                     globalInc--;
                 }
                 if(globalInc >= 4)// it will allow 3 checkboxes only
                 {
                     Toast.makeText(context, "Error = " + globalInc, Toast.LENGTH_LONG).show();
                     checkboxView.setChecked(false);
                     globalInc--;
                 }
                 else
                 {
                    c.setSelected(isChecked);
                 }
                 System.out.println(" ---------------    "+globalInc);
            }
        });

3
不,它不能正常工作。在滚动 ListView 后,用户仍然可以选择超过 3 个复选框。 - Deepak Gupta
它显示ClassCastException,因为gettag返回Integer。如何解决?@UMAR - Pankaj

2

我解决了问题:“滚动ListView后,用户仍然可以选择超过3个复选框”。感谢您的耐心。

设置静态变量 int count = 0;

最初的回答

                     if (isChecked) {
                        count++;
                    } else if (!isChecked) {
                        count--;
                    }

                    if (count >= 4) {
                        buttonView.setChecked(false);
                        count--;
                    } else {
                        int getPosition = (Integer) buttonView.getTag();

                       contact.get(getPosition).setSelected(buttonView.isChecked());
                    } 

最重要的是在else中添加count=0,并在else之后添加viewHolder.chkContact.setTag(position);

if(convertView == null){   

}else
{
 viewHolder = (ViewHolder) convertView.getTag();
 count=0;
 }
 viewHolder.chkContact.setTag(position);

`


1

使用静态int计数变量,并根据以下条件递增:

如果holder.checkBox.isChecked()为True,则计数加1,然后检查count>3,如果成立则向用户显示弹出窗口。

希望有所帮助。


首先,测试当前复选框是否被选中或未选中,如果被选中,则测试计数器是否大于等于3,否则(复选框未选中),则将计数器减1 :) - Houcine
仍然不行...我在一个单独的类中使用适配器,这可能是我在其中使用静态变量的问题吗? - UMAR-MOBITSOLUTIONS

0

试试这个:

public class AccountListAdapter extends BaseAdapter {

@SuppressWarnings("unused")
private final static String TAG = AccountListAdapter.class.getSimpleName();

private Context context;
private List<Account> rowItems;

private int selectedItemCounter = 0;

private final int limit;

public AccountListAdapter(Context context, List<Account> items, int limit) {
    this.context = context;
    this.rowItems = items;
    this.limit = limit;
}

public View getView(final int position, View convertView, ViewGroup parent) {

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    final Account rowItem = (Account) getItem(position);

    convertView = mInflater.inflate(R.layout.account_selection_item, null);

    TextView tv = (TextView) convertView.findViewById(R.id.textView);
    ToggleButton tb = (ToggleButton) convertView
            .findViewById(R.id.toggleButton);

    tb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {

            if (isChecked && !rowItem.isSelected()) {

                if (selectedItemCounter >= limit) {
                    Toast.makeText(context,
                            "can't be more" + selectedItemCounter,
                            Toast.LENGTH_SHORT).show();
                    buttonView.setChecked(false);
                    return;
                }

                rowItem.setSelected(true);
                selectedItemCounter++;
            } else if (!isChecked && rowItem.isSelected()) {
                rowItem.setSelected(false);
                selectedItemCounter--;
            }

        }
    });

    tv.setText(rowItem.getDevId());
    tb.setChecked(rowItem.isSelected());

    return convertView;
}

@Override
public int getCount() {
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}
}

尝试使用ViewHolder模式改进我的代码,但失败了。 如果有更好的想法,请告诉我。


我曾经回答过一个类似的问题,链接为http://stackoverflow.com/questions/24497827/set-limit-on-listview-multiple-section-mode/24503580#24503580。在这里重复回答是否不妥? - Paparika

0
int globalInc = 0;
boolean isCheckGlobal = false;

ArrayList<Integer> checkings = new ArrayList<Integer>();

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        convertView = inflator.inflate(R.layout.list_inner, null);
        viewHolder = new ViewHolder();
        viewHolder.friendName = (TextView) convertView
                .findViewById(R.id.friendName);

        viewHolder.checkbox = (CheckBox) convertView
                .findViewById(R.id.checkbox);

        final MyAdapterSecond objectMyAdapter = new MyAdapterSecond();

        viewHolder.checkbox.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                int getPositionInClick = (Integer) v.getTag();


                if (isCheckGlobal == false) {
                    if (checkings.contains(getPositionInClick)) {
                        globalInc--;
                        checkings.remove(checkings.indexOf(getPositionInClick));
                                                } else {
                        objectMyAdapter.getCheck(false);
                    }
                } else if (isCheckGlobal == true) {
                                            if (checkings.size() < 4) {
                        globalInc++;
                    }

                }
            }
        });

        viewHolder.checkbox
                .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

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



                        list.get(getPosition).setSelected(
                                buttonView.isChecked());                            

                        callCheck(buttonView, "hi1");
                        if (checkings.size() > 4                            {
                            Toast.makeText(context, "Error = " + globalInc,
                                    Toast.LENGTH_LONG).show();
                                                            objectMyAdapter.setCheck(buttonView);
                            isCheckGlobal = false;


                        } else {
                            buttonView.setSelected(isChecked);
                            if (isChecked
                                    && (!checkings.contains(getPosition))) {
                                checkings.add(getPosition);
                                                                }
                            else if(!isChecked){
                                if(checkings.contains(getPosition)){
                                    checkings.remove(checkings.indexOf(getPosition));
                                }
                            }
                            isCheckGlobal = true;
                                                        }

                    }
                });
        convertView.setTag(viewHolder);
        convertView.setTag(R.id.friendName, viewHolder.friendName);

        convertView.setTag(R.id.checkbox, viewHolder.checkbox);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    viewHolder.checkbox.setTag(position); // This line is important.

    viewHolder.friendName.setText(list.get(position).getname());

            viewHolder.checkbox.setChecked(list.get(position).isSelected());

    return convertView;

 }


 class MyAdapterSecond {
    CompoundButton buttonView;

    public void setCheck(CompoundButton buttonView) {
        this.buttonView = buttonView;
    }

    public void getCheck(boolean flag) {
        this.buttonView.setChecked(flag);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接