2010-05-12 22 views
9

È possibile creare un elenco a scelta multipla con android:choiceMode="multipleChoice" o setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) su un ? Sono in grado di farlo con CheckBox su un semplice ListView, ma non sembra funzionare con ExpandableListView. In quest'ultimo caso, fare clic sull'elemento dell'elenco (genitore o figlio) non influisce sulla casella di controllo come nel primo.ChoiceMode è compatibile con ExpandableListView?

Ho notato che è possibile fare clic esattamente sulla casella per attivarla, ma questo è un obiettivo molto piccolo.

Questo è un relevant unanswered forum post.

risposta

7

Dopo un po 'di studio, la risposta è No. Lo stato "Controllato" sembra essere tracciato internamente da "posizione", in modo che una voce "genitore" (alias "gruppo") una via verso il basso nell'elenco che è controllato possa trasferirsi il suo controllo a un bambino sopra di esso se il genitore precedente nell'elenco è espanso.

Ho finito per tracciare i segni di spunta nella mia struttura dati.

+0

Grazie mille. Questa risposta mi ha salvato il tempo. –

9

Per impostazione predefinita no. Controllo del codice sorgente si può vedere la seguente:

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  } 

Fonte: 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

Il problema qui è che se la riga non è né intestazione piè di pagina, il metodo performItemClick di classe super (android.widget.AbsListView) non verrà chiamato, che è quello che tiene conto della modalità scelta: 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

Quindi, la soluzione unica è implementare la logica di scelta in onChildItemClickListener noi stessi. Ecco il codice di esempio per scelta multipla:

https://github.com/jiahaoliuliu/ExpandableListViewMultipleChoice

+0

Grazie per la soluzione semplice! –