Vista de lista personalizada con el problema de la casilla de verificación
Estoy tratando de crear una lista personalizada que tendrá checkboxes que le permiten seleccionar varios elementos de la lista.
La lista con las casillas de verificación se muestra ok, pero si compruebo una casilla de verificación y, a continuación, desplazar otros elementos más abajo en la lista también se comprueban.
- Diálogo de lista personalizada de Android
- ¿Cómo obtener una lista de servicios en ejecución en Android?
- Iconos en un diálogo de lista
- Android: patrón de ViewHolder y diferentes tipos de filas?
- Buenas prácticas para ordenar una lista con una de las cuatro reglas
Es básicamente el mismo problema que aquí
Entiendo que tiene algo que ver con la forma en que Android recicla la vista, pero no puedo ver cómo arreglar esto! ¿Puede alguien ayudarme ???
Gracias – Mike
- Obtener la lista de contactos pertenecientes a un grupo específico
- Obtener la lista de lugares WiFi disponibles
- Android: diseño de vista personalizada para SectionIndexer e inhabilitación de SectionIndexer sobre la marcha
- Borde de diseño en forma cuadrada con bordes interiores redondos
- Cómo personalizar los elementos de la lista en un AlertDialog de Android
- Android Cómo saber qué casilla de verificación está seleccionada
- Visibilidad de vista para Android en ListAdapter
- Android: ¿Cómo puedo comprobar un elemento en particular en CheckView ListView?
Necesita una estructura de datos para realizar un seguimiento de qué filas están marcadas. Esto podría ser tan simple como un bool[] checked
.
En su getView
, asegúrese de que establece el estado de casilla de verificación al contenido de checked[position]
. También debe establecer un OnCheckedChangedListener en las casillas de verificación en getView
para que actualicen sus datos con la checked[position] = isChecked
.
Sí, las filas de un ListView
se reciclan, así que asegúrese de rellenar todos los datos apropiados para una fila antes de salir de getView
.
Puede intentar implementar OnClickListener para la casilla de verificación en lugar de OnCheckChangedListener. Funcionó para mí.
Cree un ArrayList<Integer>
. Agregue un OnCheckChangedListener
a su casilla de verificación. Dentro del método cambiado, agregue o quite la position
vista de lista a ArrayList<Integer>
.
En su método getView
, compruebe si el ArrayList<Integer>
contiene la position
vista de lista actual. Si contiene la posición, se establece en true, de lo contrario false.
Cada vez que haga clic en una casilla de verificación, agregue o quite el Integer
de ArrayList
.
Compruebe el código abajo –
public View getView(int position, View convertView, ViewGroup parent){ View view = convertView; ViewHolder holder = new ViewHolder(); if(view == null){ view = inflater.inflate(R.layout.list_callcycle_blue, null); holder.llContainer = (LinearLayout) view.findViewById(R.id.ll_container); holder.lblLabel = (TextView) view.findViewById(R.id.txt_desc); holder.cb = (CheckBox) view.findViewById(R.id.cb_store); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } final Object data = getItem(position); holder.lblLabel.setText(data.getDescription()); holder.cb.setTag(position); holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int position = (Integer) buttonView.getTag(); objects.get(position).setChecked(buttonView.isChecked()); } }); holder.cb.setChecked(isChecked(position)); return view; }
Siempre tenga en cuenta, utilice el cambio holder.cb.setOnCheckedChangeListener()
es decir, cualquier oyente antes de configurar los datos, en nuestro caso es holder.cb.setChecked()
Razón: Cuando nos desplácese, listview reciclar las vistas, por lo que si setchecked se utiliza antes de los oyentes, entonces se seleccionan los valores sobre la base de oyente de edad. Y si lo ponemos después del oyente, entonces tomará los últimos valores
PIEZA isChecked()
parte inferior se muestra cómo se isChecked()
métodos isChecked()
y setChecked()
para recuperar datos verificados
/* * This function is in your Custom Adapter Class */ private boolean isChecked(int position){ return object(position).isChecked(); } /** * Getter Setter Class / Data Model Class that defines your object */ private class MyObject{ private boolean isChecked; private String a, b, c, orWhateverYourObjectNeeds; public void setChecked(boolean isChecked){ this.isChecked = isChecked; } public boolean isChecked(){ return isChecked } }
- El proyecto no se puede compilar después de actualizar a gradle: 2.1.0-alpha5
- IntentService y Threadpool