Cómo limitar la selección de casilla de verificación en listview?
amigos,
quiero limitar la selección de la casilla de verificación en android listivew a por ejemplo sólo 3 casillas de verificación debe ser seleccionado de lo contrario debería dar mensaje de error.
- BaseAdapter ListView Filtrado de Android
- Android ListView setSelectionFromTop no funciona
- Crash en ListView en AbsListView.obtainView para ListActivity
- ListView elemento seleccionado drawable
- Visualización de filas vacías en Android listview
el usuario puede seleccionar tres casillas de verificación de la lista cualquiera me guía cómo lograr esto? aquí está mi adaptador
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; } }
Cualquier ayuda sería apreciada.
- ¿Existen la posición getFirstVisiblePosition y getLastVisiblePosition de ListView?
- Obtener posición en ListView
- Android: ¿Cómo hacer que las filas de un ListView tengan alturas variables?
- Android: vista de la lista de identificaciones
- Listview items Animación Parar mientras se desplaza
- Todavía otro getView llamado varias veces
- No se puede establecer el color cuando android: state_enabled = "false"
- ¿Cómo saber si la última fila del ListView se muestra completamente?
finalmente he resuelto este problema 🙂 donde como globalInc es variable global con valor predeterminado 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); } });
Tome una variable de conteo int estática e incremente la utilización de estas condiciones
holder.checkBox.isChecked () si es cierto, entonces el incremento en el recuento, luego el recuento de cheques> 3 y luego mostrar el popup al usuario
Espero que esto sea Ayuda.
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); } }
Prueba esto:
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)); } }
intentó mejorar mi código con el patrón de ViewHolder pero falló. si alguien tiene una mejor idea, por favor hágamelo saber.