2010-06-28 36 views
27

¿es posible/recomendable tener una vista de lista anidada?android lista de listas anidadas

es decir, ¿una lista que se incluye dentro de una fila de otra lista de lista?

Un ejemplo sería donde mi lista principal está mostrando las entradas del blog, y luego en cada fila, que tendría otra vista de lista para los comentarios para cada puesto (que sería plegable)

Respuesta

31

que tenían el mismo problema hoy en día, así que esto es lo que hice para resolverlo:

tengo un ListView, con un CustomAdapter, y en el getView del customAdapter, yo tener algo como esto:

LinearLayout list = (LinearLayout) myView.findViewById(R.id.list_musics); 
list.removeAllViews(); 

for (Music music : albums.get(position).musics) { 
    View line = li.inflate(R.layout.inside_row, null); 

    /* nested list's stuff */ 

    list.addView(line); 
} 

Por lo tanto, reanudar, No es posible anidar en ListViews, pero puede crear una lista dentro de una fila usando LinearLayout y llenándolo con código.

+0

El listener a la lista no funciona con esto. ¿Alguna solución? –

+0

Gracias amigo. Es una gran idea. –

+0

Deseo implementar la lista Dentro de la Lista pero no puedo Implementar. ¿Existe alguna Alternativa para resolver este problema? Excepto ListView expansible – seon

6

This sonido como lo ¿estas buscando? Si no es así, o si esto no funciona, sugeriría tener dos vistas de lista: una de, digamos, publicaciones de blog y la segunda de comentarios, y una acción en una publicación de blog lo llevará a la segunda vista , poblado con los comentarios relevantes.

+0

lamentablemente, queremos mostrar los comentarios en línea ... por lo que abrirlos en otra actividad no funcionará. – Ben

10

es lo que está buscando ExpandableListView? Por supuesto, eso está limitado a solo dos niveles de listados (pero parece que funcionaría según sus necesidades).

+0

bueno, la cosa es que no quiero que la lista sea explicable ... solo quiero mostrar algunos datos anidados ... es decir, la publicación original del blog, luego los 2/3 comentarios más recientes, y quizás seguidos por una botón 'mostrar todos los comentarios' ... – Ben

+0

Eso me suena a un diseño diferente. Lo vería como un contenedor de algún tipo (LinearLayout, RelativeLayout, lo que sea) con un TextView para la publicación del blog y un ListView para los comentarios. Simplemente cargue los primeros comentarios en la vista de lista e implemente un escucha de clic para el último elemento de la lista que carga los comentarios restantes. Mi $ .02 de todos modos. – kiswa

+0

, bueno, sí, excepto que habrá múltiples publicaciones de blog y comentarios múltiples debajo de cada publicación de blog.así que probé una prueba, al hacer que mi diseño de vista de fila contuviera una vista de lista, luego usé un adaptador de lista de matriz simple con algunas cadenas ficticias codificadas para ver si podía procesarlo. se representa, la vista de lista interna parece tener barras de desplazamiento dentro de ella, pero esa lista no se puede desplazar. parecía un iframe pirateado, excepto que solo mostraba la primera fila, no importaba lo que hiciera. ni siquiera height = fill_parent funcionaría. mi próximo enfoque será probar una vista de tabla anidada en la lista. – Ben

0

puede hacerlo de esta manera:

dentro de la disposición de las hileras xml listview matriz añadir la siguiente disposición de la tabla

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

entonces usted tiene que hacer un diseño para la lista de elementos secundarios con el nombre 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> 

en su método getView adaptador de vista de lista padre agregue el código siguiente:

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

Será mejor que use un ListView, no anidado. Anidar ListView es una forma ineficiente. Es posible que ListView no se desplace suavemente y ocupe más memoria.

Puede organizar su estructura de datos para mostrar datos anidados en un ListView. O puede usar este proyecto PreOrderTreeAdapter. Es conveniente mostrar datos anidados en ListView o RecyclerView. Se puede usar para hacer que ListView o RecyclerView sean colapsables, simplemente cambie la forma en que proporciona sus datos y notifique al adaptador.

Cuestiones relacionadas