2011-11-28 29 views
22

Actualmente estoy trabajando en un proyecto en el que necesito algo como lo siguiente:de varias capas ExpandableListView

- MainGroup 1 (Expandable) 
    - SubGroup 1 (Expandable) 
    - SubSubGroup 1 (Expandable) 
     - Child View 
     - Child View 
     - ... 
    - SubSubGroup 2 (Expandable) 
     - Child View 
     - Child View 
     - ... 
    - SubGroup 2 (Expandable) 
    - SubSubGroup 3 (Expandable) 
     - Child View 
     - ... 
    - SubSubGroup 4 (Expandable) 
     - Child View 
     - ... 
    - SubGroup 3 (Expandable) 
    - Child View 
    - ... 
- MainGroup 2 (Expandable) 
    - ... 

A lo sumo habría un ExpandableListView dentro de un ExpandableListView dentro de un ExpandableListView - 3 capas de por lo ExpandableListView :

  • MainGroup solo tendría otras ExpandableListView.
  • SubGroup tendría otro ExpandableListView a excepción de los dos últimos, que siempre será ChildViews. (Estoy pensando que esos dos podrían simplemente ser sustituidos por uno para SubSubGroup)
  • SubSubGroup siempre serían ChildViews.

Mi problema es que creo que no entiendo los principios básicos de cómo los diseños ExpandableListView son hijos. He visto ejemplos como this, pero no entiendo la funcionalidad.

He intentado simplemente agregar un ExpandableListView como un niño en otro - pero algo no funciona, ya que solo el primer elemento del interior ExpandableListView es visible si expande uno de los grupos externos. Sin embargo, al configurar manualmente la altura del contenedor de grupos externos, lo hago lo suficientemente grande como para mostrar todos los elementos en el interior ExpandableListView. Para que sea óptimo, el cálculo de la altura debe, por supuesto, hacerse sobre la marcha.

Por lo tanto, para llegar a algunas de las preguntas más sólidos:

  • Puede alguien darme una explicación del "ciclo de vida" ExpandableListView (con esto quiero decir instantation, reutilización de puntos de vista, expandir/oyentes de colapso) incluyendo:
    • ¿Cómo y cuándo se notifica a un niño ExpandableListView que se ha expandido/colapsado?
    • ¿Cómo sabe el ExpandableListView cuánto espacio para que todos los niños puedan caber en un contenedor de grupo?
  • ¿Cuánto beneficio hay en el uso de la ExpandableListView para crear lo anterior, en comparación con sólo mezclar juntos mi propia solución utilizando algún LinearLayouts y algunos OnClickListeners?

Editar

Para mi última pregunta podría señalar que no puede estar en cualquier lugar del 1 al 20 + MainGroups.

+0

su solución ha sido resuelta ...? –

+0

Nunca resolví el problema porque me cambiaron a otro proyecto, pero la respuesta de QuickNick definitivamente habría sido el camino a seguir. – kaspermoerch

Respuesta

10

En primer lugar, déjenme recomiendo GrepCode sitio. Tiene fuentes de clases de Android SDK. Gracias por ellos, descubrí los principios básicos de AdapterViews (le di un enlace a ExpandableListView, pero es mejor si investiga no solo eso, sino también sus padres de clase).

Ahora, sus preguntas y mis respuestas:

Cómo y cuándo se notifica una ExpandableListView que un niño se desplegado/contraído?

Ver método handleItemClick(View v, int position, long id)

¿Cómo funciona el ExpandableListView saber cuánto espacio para hacer para todos los niños para encajar en un contenedor de grupos?

No investigué bien esta pregunta, pero hasta donde yo sé, está hecha por el método requestLayout(). También descubrimos que una vista desplazable no se puede incrustar en otra vista desplazable. (Es un error ampliamente conocido: poner ListView en ScrollView o ListView en ExpandableListView).

¿Cuánto beneficio hay en el uso de la ExpandableListView para crear lo anterior, en comparación con sólo mezclar juntos mi propia solución utilizando algunos LinearLayouts y algunos OnClickListeners?

AdapterViews son más rápidos. Pero su construcción es demasiado compleja incluso para ExpandableListView. Puedes usar 2 soluciones.

  1. Guru-solución: si usted es un profesional de diseño de sus propios Vistas/ViewGroups desde cero (quiero decir, que comprenda métodos requestLayout(), dispatchDraw() y así sucesivamente), y luego escribir su propio GrandExpandableListAdapter con 3 niveles.
  2. Solución media: use ExpandableListAdapter para los primeros 2 niveles y use LinearLayouts para 3er nivel.
1

Es posible que desee comprobar this proyecto de salida. No lo he probado, pero creo que vale la pena intentarlo. El ExpanadableListView predeterminado es bastante limitado, diseñado originalmente para admitir solo 2 niveles. Puedes hackearlo para que sea compatible con más niveles que eso, pero se volverá complicado.

+0

¿Cómo afectaría el uso de mi licencia? Estoy desarrollando para una empresa, así que no puedo hacer cosas que exijan que mi código fuente sea de código abierto. – kaspermoerch

+0

No estoy seguro de que la licencia BSD le exija que mantenga su proyecto abierto. Al menos no pude encontrar nada que indique lo contrario aquí: http://www.opensource.org/licenses/bsd-license.php. Aunque puedo estar terriblemente equivocado. –

+0

Licencias a un lado - cumpliría mi propósito por lo que +1. Encuentro que solo ejecutar el ejemplo simple provisto en la fuente es bastante lento, así que todavía estoy buscando respuestas a mis preguntas. – kaspermoerch

1

Aunque esta no es la solución completa, sigue siendo una lista desplegable de 3 capas. Así que te queda cómo lo modelas.

aquí es la clase

package com.custom.nagee; 

import android.app.ExpandableListActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.ExpandableListView; 
import android.widget.LinearLayout; 

public class CustomemExpandible extends ExpandableListActivity{ 
    LayoutInflater inflator; 
    boolean flag = true; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     inflator = LayoutInflater.from(getApplicationContext()); 
     setListAdapter(new MyAdapter()); 
    } 

    @Override 
    public boolean onChildClick(ExpandableListView parent, View v, 
      int groupPosition, int childPosition, long id) { 
     if(flag){ 
      v.findViewById(childPosition).setVisibility(View.VISIBLE); 
      flag = false; 
      return true; 
     } 
     v.findViewById(childPosition).setVisibility(View.GONE); 
     flag = true; 
     return true; 
    } 
    class MyAdapter extends BaseExpandableListAdapter{ 

     @Override 
     public Object getChild(int groupPosition, int childPosition) { 
      return null; 
     } 

     @Override 
     public long getChildId(int groupPosition, int childPosition) { 
      return 0; 
     } 

     @Override 
     public View getChildView(int groupPosition, int childPosition, 
       boolean isLastChild, View convertView, ViewGroup parent) { 
      LinearLayout linearLayout = (LinearLayout)inflator.inflate(R.layout.group, null); 
      linearLayout.getChildAt(1).setId(childPosition); 
      return linearLayout; 
     } 

     @Override 
     public int getChildrenCount(int groupPosition) { 
      return 2; 
     } 

     @Override 
     public Object getGroup(int groupPosition) { 
      return null; 
     } 

     @Override 
     public int getGroupCount() { 
      return 2; 
     } 

     @Override 
     public long getGroupId(int groupPosition) { 
      return 0; 
     } 

     @Override 
     public View getGroupView(int groupPosition, boolean isExpanded, 
       View convertView, ViewGroup parent) { 
      return ((LinearLayout)inflator.inflate(R.layout.group, null)); 
     } 

     @Override 
     public boolean hasStableIds() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean isChildSelectable(int groupPosition, int childPosition) { 
      return true; 
     } 

    } 
} 

y aquí va el archivo XML

group.xml

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    android:id="@+id/editText1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textColor="@color/back" 
    android:layout_marginLeft="30dip" 
    android:text="DONE" > 
</TextView> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:layout_marginLeft="30dip" 
    android:visibility="gone" > 

    <TextView 
     android:id="@+id/editText2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="DONE"> 
    </TextView> 

    <TextView 
     android:id="@+id/editText3" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="DONE" /> 

    <TextView 
     android:id="@+id/editText4" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="DONE" /> 
</LinearLayout> 

y esto es en la carpeta de color para cambiar el color del texto, es posible, incluso puede cambiar el fondo para obtener una mejor apariencia.

back.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_enabled="false" android:color="#808080"/> 
    <item android:state_window_focused="false" android:color="#808080"/> 
    <item android:state_pressed="true" android:color="#808080"/> 
    <item android:state_selected="true" android:color="#000000"/> 
    <item android:color="#FF0000"/> <!-- not selected --> 
</selector> 

esperemos que funcione ...

Cuestiones relacionadas