2011-05-27 38 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