2010-05-12 20 views
9

¿Es posible hacer una lista de opciones múltiples con android:choiceMode="multipleChoice" o setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) en un ExpandableListView? Puedo hacer esto con CheckBox es en un simple ListView, pero no parece funcionar con ExpandableListView. En este último, hacer clic en el elemento de la lista (padre o hijo) no afecta a la casilla de verificación como lo hace en la primera.¿Es ChoiceMode compatible con ExpandableListView?

He notado que es posible hacer clic exactamente en la casilla para alternar, pero este es un objetivo muy pequeño.

Aquí hay un relevant unanswered forum post.

Respuesta

7

Después de algunos estudios, la respuesta es No. Estado "comprobado" parece ser rastreado internamente por "posición", por lo que un elemento "principal" (también conocido como "grupo") puede transferir su verificación a un niño arriba si el padre anterior en la lista se expande.

Terminé rastreando marcas de verificación en mi propia estructura de datos.

+0

Muchas gracias. Esta respuesta me salvó el tiempo. –

9

Por defecto no. Comprobación del código fuente se puede ver la siguiente manera:

512  @Override 
513  public boolean performItemClick(View v, int position, long id) { 
514   // Ignore clicks in header/footers 
515   if (isHeaderOrFooterPosition(position)) { 
516    // Clicked on a header/footer, so ignore pass it on to super 
517    return super.performItemClick(v, position, id); 
518   } 
519   
520   // Internally handle the item click 
521   final int adjustedPosition = getFlatPositionForConnector(position); 
522   return handleItemClick(v, adjustedPosition, id); 
523  } 

533   boolean handleItemClick(View v, int position, long id) { 
534   final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position); 
535   
536   id = getChildOrGroupId(posMetadata.position); 
537   
538   boolean returnValue; 
539   if (posMetadata.position.type == ExpandableListPosition.GROUP) { 
540    /* It's a group, so handle collapsing/expanding */ 
       ... 
579   } else { 
580    /* It's a child, so pass on event */ 
581    if (mOnChildClickListener != null) { 
582     playSoundEffect(SoundEffectConstants.CLICK); 
583     return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos, 
584       posMetadata.position.childPos, id); 
585    } 
586 
587    returnValue = false; 
588   } 
589 
590   posMetadata.recycle(); 
591 
592   return returnValue; 
593  } 

Fuente: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/widget/ExpandableListView.java#ExpandableListView.handleItemClick%28android.view.View%2Cint%2Clong%29

El problema aquí es que si la fila no se cabecera ni pie de página, el método de la superclase performItemClick (android.widget.AbsListView) no se llamará, que es el que tiene en cuenta el modo de elección: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/widget/AbsListView.java#AbsListView.performItemClick%28android.view.View%2Cint%2Clong%29

Por lo tanto, la única solución es implementar la lógica de elección en onChildItemClickListener nosotros mismos. Aquí está el código de ejemplo para la opción múltiple:

https://github.com/jiahaoliuliu/ExpandableListViewMultipleChoice

+0

¡Gracias por una solución simple! –