2011-03-09 2 views
0

Я хочу ограничить количество отмеченных флажков в своем списке. У меня есть глобальный массив с отмеченным флажком Checkbox, и когда его размер превышает заданный предел, я бы отключил все флажки без флажка.Как ограничить количество отмеченных флажков в моем пользовательском адаптере?

Поскольку я хочу, чтобы снятый флажок был отключен, как только установлен последний флажок флажка, я думаю, что это должно быть сделано в обработчике Checkbox onclick, иначе представления не будут обновляться до того, как getview снова будет вызван. Это правильно?

Теперь, чтобы отключить неконтролируемый, я должен получить доступ ко всему флажку моего списка. Как это сделать и обновить представления из обработчика checkbox onclick?

Это может быть не лучший способ достичь этого, поэтому любое предложение оценивается.

Спасибо.

public class FriendAdapter extends SimpleCursorAdapter implements OnClickListener { 

    private Context mContext; 
    private int mLayout; 
    private Cursor mCursor; 
    private int mNameIndex; 
    private int mIdIndex; 
    private LayoutInflater mLayoutInflater; 
    private final ImageDownloader imageDownloader = new ImageDownloader(); 

    private final class ViewHolder { 
     public TextView name; 
     public ImageView image; 
     public CheckBox checkBox; 
    } 

    public FriendAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 

     this.mContext = context; 
     this.mLayout = layout; 
     this.mCursor = c; 
     this.mNameIndex = mCursor.getColumnIndex(WhipemDBAdapter.KEY_NAME); 
     this.mIdIndex = mCursor.getColumnIndex(WhipemDBAdapter.KEY_FB_ID); 
     this.mLayoutInflater = LayoutInflater.from(context);   
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (mCursor.moveToPosition(position)) { 
      ViewHolder viewHolder; 

      if (convertView == null) { 
       convertView = mLayoutInflater.inflate(mLayout, null); 

       viewHolder = new ViewHolder(); 
       viewHolder.name = (TextView) convertView.findViewById(R.id.contact_name); 
       viewHolder.image = (ImageView) convertView.findViewById(R.id.contact_pic); 
       viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 
       viewHolder.checkBox.setOnClickListener(this); 

       convertView.setTag(viewHolder); 
      } 
      else { 
       viewHolder = (ViewHolder) convertView.getTag(); 
      } 

      String name = mCursor.getString(mNameIndex); 
      String fb_id = mCursor.getString(mIdIndex);   
      boolean isChecked = ((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id); 

      viewHolder.name.setText(name); 
      imageDownloader.download("http://graph.facebook.com/"+fb_id+"/picture", viewHolder.image); 

      viewHolder.checkBox.setTag(fb_id); 
      viewHolder.checkBox.setChecked(isChecked); 
     } 

     return convertView; 
    } 

    @Override 
    public void onClick(View v) { 

     CheckBox cBox = (CheckBox) v; 
     String fb_id = (String) cBox.getTag(); 

     if (cBox.isChecked()) { 
      if (!((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id)) 
       ((GlobalVars) mContext.getApplicationContext()).addSelectedFriend(fb_id); 
     } else { 
      if (((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id)) 
       ((GlobalVars) mContext.getApplicationContext()).removeSelectedFriend(fb_id); 
     } 

     int numSelectedCheckboxes = ((GlobalVars) mContext.getApplicationContext()).isFriendSelected(fb_id); 

     if(numSelectedCheckBoxes > 6) 
     { 
     /* 
      How can I access all the checkboxes here to disable the unckecked ones? 
     */ 
     } 


    } 
} 

ответ

0

Следите за тем, какие элементы проверяются в отдельном массиве, не отслеживайте элементы вида по мере их рециркуляции.

public class FriendAdapter extends SimpleCursorAdapter implements OnClickListener { 
    // Map item position to its check state (true/false) 
    private Map<Integer, Boolean> checkStates; 

    // ... 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (mCursor.moveToPosition(position)) { 
      ViewHolder viewHolder; 

      if (convertView == null) { 
       // ... 
      } 
      else { 
       // ... 
      } 

      // ...  
      Boolean isChecked = checkStates.get(position); 

      viewHolder.checkBox.setTag(position); 
      viewHolder.checkBox.setChecked(isChecked==null ? false : isChecked); 
     } 

     return convertView; 
    } 

    @Override 
    public void onClick(View v) { 
     CheckBox cBox = (CheckBox) v; 
     int position = (Integer) cBox.getTag(); 

     checkStates.put(position, cBox.isChecked()); 

     // Here you iterate on checkStates to disable/enable according to the number 
     // of checked ones. 


     // Update the UI with the new check states 
     notifyDataSetChanged(); 
    } 
} 
+0

Спасибо! Метод notifyDatasetChanged() не определен для типа FriendAdapter, подумал. – jul

+0

Typo: http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged() –

+0

Извините ... много кодирования в моих глазах. Благодарю. – jul

Смежные вопросы