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:
- ¿Cómo hacer una galería de imágenes de 2 dimensiones con desplazamiento horizontal y vertical?
- ¿Cómo mostrar archivos de audio en una vista de lista en Android?
- ¿Cómo puedo permitir que un usuario reordene los elementos en una lista?
- Cómo borrar un Android ListView y llenarlo con nuevos datos?
- CheckBox Hacer la listaNo se puede hacer clic en el elemento
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.
- Android: Cambiar el fondo del botón en ListView Row con onClick
- Vista de lista de carga dinámica de Android problemas de onScrollListener
- El método get (String) no está definido para el tipo String error al agregar los códigos a la clase filter del adaptador en android
- ArrayAdapter está repitiendo el encabezado de interfaz de usuario para cada elemento de ListView
- ListAdapter Filtro que no sea el uso de cadenas?
- Android RatingBar se pinta mal
- ¿Número múltiple de columnas en un único StaggeredGridView?
- Android: Mostrar la imagen en la vista de imagen por SimpleAdapter
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.
- Error de Gradle en Android Studio: Plugin con id 'com.android.library' no encontrado
- Problema de renderizado con Android Studio 0.4.0