2011-12-14 9 views
7

He configurado un ListView que contiene una casilla de verificación en cada fila (junto con un TextView). Por alguna razón, cuando "marque" una de las casillas, parece "marcar" cualquier casilla que esté en el lado opuesto de ListView (es decir, al seleccionar la casilla superior, se selecciona la casilla inferior mientras que la parte superior permanece desmarcadaCasillas de verificación en un ListView: cuando selecciono el primero, comprueba el último y viceversa

Me doy cuenta de que no hay ningún código aquí para trabajar, pero me preguntaba si este es un problema general. Si no, puedo intentar publicar un código. ¡Gracias!

+0

publicar su código para el adaptador ListView y recursos xml – Spidy

+1

Probablemente debería publicar algo de código, pero de hecho existe un problema general común (no un error, pero una cosa de diseño que muchas personas nuevas en Android no se dan cuenta), que probablemente es con lo que te estás encontrando para hacer con la forma en que Android ListViews reutiliza Vistas para evitar la creación excesiva de objetos y la recolección de basura. – kabuko

+0

Mi objetivo es crear un menú que aparezca (como en gmail) cuando el usuario seleccione una o más casillas de verificación. No estoy seguro de cómo decidir qué partes del código publicar, pero cuando saco mis métodos que muestran mi "menú" en la parte inferior, el problema desaparece. ¿Alguna idea sobre cómo implementar la recolección de basura? – jonstaff

Respuesta

4

Las vistas se reciclan en un ListView. ¿por qué algunos se controlan cuando usted piensa que no debería ser.

Aquí está la oferta: La casilla de verificación tiene idea que artículo en su adaptador representa. Es solo una casilla de verificación en una fila en una Vista de la lista. Debe hacer algo para "enseñar" las filas de los elementos del conjunto de datos que están mostrando actualmente. Por lo tanto, en lugar de utilizar algo tan simple como un conjunto de cadenas como los datos de su adaptador, cree un nuevo objeto modelo que almacene el estado de la casilla de verificación. Entonces, antes de regresar a la fila en getView(), se puede hacer algo como:

//somewhere in your class 
private RowData getData(int position) { 
return(((MyAdapter)getListAdapter()).getItem(position)); 
} 



//..then in your adapter in getView() 

    RowData object = getModel(position); 

    if(object.isChecked()) { 
     myCheckbox.setChecked(true); 
    } else { 
     myCheckbox.setChecked(false); 
     } 

    //then retun your view. 
+0

Gracias por su respuesta. My ListAdapter está en el método fillData() en una clase completamente diferente. ¿Es eso incorrecto? – jonstaff

+0

@ jstaff107, no, puede tener su adaptador donde quiera. – LuxuryMode

+0

¿No estoy seguro de dónde viene la clase "RowData"? – jonstaff

Cuestiones relacionadas