2011-05-27 39 views
3

朋友,如何限制listview中的复选框选择?

我想限制android listivew中的复选框选择,例如只应选择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; 
     } 




} 

任何帮助,将不胜感激。

回答

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复选框ex – 2014-05-06 06:06:33

+0

它显示classCastException bcoz gettag返回Integer.How解决这个问题? @UMAR – Pankaj 2014-08-22 09:50:38

1

采取静态诠释计数变量和使用这些条件

holder.checkBox.isChecked()递增,如果它为真,则在计数 递增然后检查计数> 3然后显示弹出到用户

我希望这是帮助。

+0

第一件事就是,要测试当前checkBox是否被选中,如果被选中,则测试计数器是否大于等于3,否则(复选框未选中,然后递减计数器:) – Houcine 2011-05-27 08:46:41

+0

仍然不是工作......我在一个单独的类中使用适配器可能是我使用它的静态变量的问题? – UMAR 2011-05-27 09:14:15

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); 
    } 
} 
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模式的代码,但失败。 如果有人有更好的主意,请让我知道。

+0

我没有回答类似的问题从http://stackoverflow.com/questions/24497827/set-limit-on-listview-multiple-section-mode/24503580#24503580在这里重复它是错误的吗? – Paparika 2014-07-01 06:26:03