El listview personalizado con una sola casilla de verificación se selecciona uno a la vez

Tengo un listview personalizado con cada fila contaning una casilla de verificación y el texto. Ahora lo que quiero que si una casilla de verificación de la fila listview está marcada para que otros casilla de verificación en la otra fila si está marcada. Se delected automáticamente (es decir, sólo una casilla de verificación debe ser seleccionado uno a la vez). ¿Cómo debo hacer eso.

Hasta ahora lo que he hecho es la siguiente:

public class CustomAdapter extends BaseAdapter{ Context context; List<String> items; boolean array[]; public CustomAdapter(Context context, List<String> items) { super(); this.context = context; this.items = items; array =new boolean[items.size()]; } @Override public int getCount() { // TODO Auto-generated method stub return items.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return items.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v=convertView; final int pos=position; if(v==null) { v=LayoutInflater.from(context).inflate(R.layout.list,null); } TextView txt1=(TextView) v.findViewById(R.id.textView1); final CheckBox chkbox=(CheckBox) v.findViewById(R.id.checkBox1); txt1.setText(items.get(position)); int selectedindexitem=0; chkbox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(chkbox.isChecked()) { array[pos]=true; }else{ array[pos]=false; } } }); chkbox.setChecked(array[pos]); return v; } } In this code i can select multiple checkbox at a time but i need only one checkbox should be checked one at a time. 

Es necesario realizar un seguimiento del elemento seleccionado y el código en consecuencia.

 public class CustomAdapter extends BaseAdapter{ Integer selected_position = -1; @Override public View getView(int position, View convertView, ViewGroup parent) { // Your Code chkbox.setChecked(position==selected_position); chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) { selected_position = position; } else{ selected_position = -1; } notifyDataSetChanged(); } }); return convertView; } } 

Intente cambiar todo el elemento valor booleano false excluir el elemento seleccionado después de notificar el adaptador y también implementar el patrón de diseño ViewHolder para el rendimiento de ListView:

  @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ holder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.list,null); holder.txt1 = (TextView) convertView.findViewById(R.id.textView1); holder.chkbox = (CheckBox) convertView.findViewById(R.id.checkBox1); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.txt1.setText(items.get(position)); holder.chkbox.setChecked(array[position]); holder.chkbox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { for (int i=0;i<array.length;i++){ if(i==position){ array[i]=true; }else{ array[i]=false; } } notifyDataSetChanged(); } }); return convertView; } class ViewHolder{ TextView txt1; CheckBox chkbox; } 

Mantener una variable:

 int checked = -1; //say 

Cada vez que intente marcar una casilla de verificación, verifique esta variable, si es -1, marque la casilla de verificación y guarde la posición del elemento de la lista en la variable marcada, cuando intente marcar otra casilla si la variable no es igual a -1 primero desmarque la casilla de verificación en la posición almacenada en la variable marcada y luego marque la casilla de verificación en la posición actual y guarde la posición actual en la variable marcada

 @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v=convertView; final int pos=position; if(v==null) { v=LayoutInflater.from(context).inflate(R.layout.list,null); } TextView txt1=(TextView) v.findViewById(R.id.textView1); final CheckBox chkbox=(CheckBox) v.findViewById(R.id.checkBox1); txt1.setText(items.get(position)); int selectedindexitem=0; if(position==selected_position) { chkbox.setChecked(true); } else { chkbox.setChecked(false); } chkbox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(chkbox.isChecked()) { array[pos]=true; selected_position = pos; }else{ array[pos]=false; } } }); chkbox.setChecked(array[pos]); MainActivity.lv.setAdapter(new CustomAdapter(context,MainActivity.listitems)); return v; } 

Fácil de mantener su selección. Obtenga su selección del modelo.

  class PropertyModel{ String VAL= "SOME VALUE" boolean selected = false; public String getVAL() {return VAL;} public void setVAL(String VAL) {this.VAL = VAL;} public boolean isSelected() {return selected;} public void setSelected(boolean selected) {this.selected = selected;} } 

Prepare su vista de esta manera:

  public class CheckBoxAdptr extends BaseAdapter{ /* .......... */ public View getView(int position, View view, ViewGroup parent) { PropertyModel items = list.get(position); View row; if (view == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); row = inflater.inflate(R.layout.list_item_checkbox, null); } else{row = view;} TextView T1 = (TextView) row.findViewById(R.id.list_item_1); CheckBox checkBox = (CheckBox) row.findViewById(R.id.list_item_check_box); T1.setText(""+items.getVAL()); if(items.isSelected()){ checkBox.setChecked(true); } else {checkBox.setChecked(false);} return row; } } 

Ahora, en tu actividad o fragmento, configura el adaptador y haz algo como esto:

  final ArrayList<PropertyModel> list = getList(); CheckBoxAdptr adpt = new CheckBoxAdptr(getActivity(), list); listview.setAdapter(adpt); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { for(int i = 0; i<list.size(); i++){ if(i!=position){ list.get(i).setSelected(false); } else{ list.get(i).setSelected(true); } } adpt.notifyDataSetChanged(); } }); 

Tenga en cuenta que todo su trabajo se realiza por adpt.notifyDataSetChanged() . Espero que esto ayude.

  • Flujo de trabajo de facturación en la aplicación en un ListView
  • Android - ¿Cómo puedo medir el rendimiento de ListView y otras vistas?
  • ¿Cómo puedo añadir un encabezado pegajoso a mi ListView?
  • Diferencias RelativeLayout entre 1,5 y 2,1
  • Añadir 2 listview en el cajón de navegación, sólo uno funciona
  • ListView ya no reacciona a onclick después de una llamada a setSelection ()
  • Animate listView childs sólo una vez que aparecen
  • Cómo utilizar addHeaderView para agregar un ImageView simple a un ListView
  • ListView establece la primera posición visible
  • ¿Cómo puedo probar ListView con Robolectric 2.2? Dice que android.widget.ListView todavía no está implementado
  • Android listview item altura
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.