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.

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

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 } } 
  • Android RecyclerView Scroll Bug
  • Lista de contactos de Android
  • Inflar una vista varias veces en el mismo padre cuando se hace clic en un botón
  • Android: Cómo deshabilitar los elementos de la lista en la creación de la lista
  • Lista de reproducción de Youtube mostrada en ListView
  • TreeMap a ArrayList Java
  • Lista de botones en Android
  • Android: Obtención de la lista de aplicaciones del dispositivo - Muy lento
  • Kotlin: Cómo trabajar con Casts de listas: Desmarcado Cast: kotlin.collections.List <Kotlin.Any?> A kotlin.colletions.List <Waypoint>
  • ExpandableListView no reacciona y recibe ningún clic
  • Android - arrastrar y soltar - reorganizar la lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.