2010-06-28 11 views
27

è possibile/consigliabile avere un listview nidificato?listview nid androide

ovvero un listView contenuto in una riga di un'altra list list?

Un esempio potrebbe essere dove la mia lista principale sta visualizzando i post del blog, e quindi in ogni riga, devi avere un'altra vista lista per i commenti per ogni post (che sarebbe pieghevole)

risposta

31

Ho avuto lo stesso problema di oggi, quindi questo è quello che ho fatto per risolverlo:

ho un ListView, con un CustomAdapter, e sulla GetView del customAdapter, ho qualcosa di simile:

Quindi, riprendendo, non è possibile annidare a ListViews, ma è possibile creare un elenco all'interno di una riga utilizzando LinearLayout e popolandolo con il codice.

+0

L'ascoltatore da elencare non funziona con questo. Qualche soluzione? –

+0

Grazie amico. Questa è una grande idea. –

+0

Voglio implementare la lista all'interno della lista, ma non sono in grado di implementare. C'è qualche alternativa per risolvere questo problema? Tranne ListView espandibile – seon

6

This suono come quello stai cercando? Se non lo sei, o se questo non funziona, ti suggerirei di avere due visualizzazioni di lista: uno dei post del blog e il secondo dei commenti, mentre un'azione su un post del blog ti porta alla seconda vista , popolato con i commenti pertinenti.

+0

sfortunatamente, vogliamo visualizzare i commenti in linea ... quindi non aprirli in un'altra attività non funzionerà. – Ben

10

È quello che stai cercando il ExpandableListView? Naturalmente, questo è limitato a solo due livelli di annunci (ma sembra che funzioni per le tue esigenze).

+0

beh, il fatto è che non voglio che la lista sia esapandibile ... voglio solo mostrare alcuni dati annidati ... cioè il post originale del blog, poi i 2/3 dei commenti più recenti, e forse seguito da un pulsante 'mostra tutti i commenti' ... – Ben

+0

Mi sembra un layout diverso. Lo vedrei come un contenitore di qualche tipo (LinearLayout, RelativeLayout, qualunque cosa) con TextView per il post del blog e un ListView per i commenti. Basta caricare i primi commenti nella vista elenco e implementare un listener di clic per l'ultimo elemento dell'elenco che carica i commenti rimanenti. I miei $ 0,02 comunque. – kiswa

+0

beh sì, tranne che ci saranno più post sul blog e più commenti sotto ogni post del blog.così ho provato un test, avendo il mio layout di visualizzazione delle righe contenente una vista elenco, ho quindi usato un semplice elenco di elenchi di array con alcune stringhe fittizie codificate solo per vedere se riuscivo a visualizzarlo. reso, la vista interna dell'elenco sembrava avere barre di scorrimento al suo interno, ma quella lista non era scorrevole. sembrava un iframe hackerato, tranne che mostrava solo la prima riga, qualunque cosa facessi. nemmeno l'altezza = fill_parent funzionerebbe. il mio prossimo approccio sarà provare una vista tabella annidata nella lista. – Ben

0

si può fare in questo modo:

all'interno del layout di fila XML principale ListView aggiungere la seguente disposizione della tabella

<TableLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/table_show" 
     android:background="#beb4b4"> 
    </TableLayout> 

allora dovete fare un layout per la lista con il nome del bambino reply_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<TableRow android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="3dp" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/tv_reply_row" 
     android:textColor="#000"/> 
</TableRow> 

nel vostro genitore metodo GetView adattatore ListView aggiungere il seguente codice:

TableLayout replyContainer = (TableLayout) 
// vi is your parent listview inflated view 
vi.findViewById(R.id.table_show); 
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


     //child listview contents list 
     String [] replys = {"a","b","c","d"}; 

     for (int i=0;i<replys.length;i++) 
     { 
     final View comments = inflater.inflate(R.layout.reply_row, null); 
     TextView reply_row = (TextView) comments.findViewById(R.id.tv_reply_row) ; 
     reply_row.setText(replys[i]); 

//for changing your tablelayout parameters 
     TableLayout.LayoutParams tableRowParams=new TableLayout.LayoutParams 
         (TableLayout.LayoutParams.FILL_PARENT,TableLayout.LayoutParams.WRAP_CONTENT); 

     int leftMargin=3; 
     int topMargin=2; 
     int rightMargin=3; 
     int bottomMargin=2; 
     tableRowParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
     comments.setLayoutParams(tableRowParams); 
      TableRow tr = (TableRow) comments; 
      replyContainer.addView(tr); 
      } 
0

È consigliabile utilizzare un ListView, non nidificato. Nesting ListView è un modo inefficiente. Il tuo ListView potrebbe non scorrere facilmente e occupare più memoria.

È possibile organizzare la struttura dati per visualizzare i dati nidificati in un ListView. Oppure puoi utilizzare questo progetto PreOrderTreeAdapter. È conveniente mostrare i dati annidati in ListView o RecyclerView. Può essere utilizzato per rendere comprovato ListView o RecyclerView, basta cambiare il modo in cui si forniscono i dati piuttosto che notificare l'adattatore.

Problemi correlati