studio programacion herramientas fundamentos con avanzado aplicaciones android expandablelistview expandablelistadapter

programacion - manual de android en pdf



Vista desplegable de capas mĂșltiples (3)

Actualmente estoy trabajando en un proyecto en el que necesito algo como lo siguiente:

- 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, sería un ExpandableListView dentro de un ExpandableListView dentro de un ExpandableListView , por lo que 3 capas de ExpandableListView :

  • MainGroup solo mantendría otros ExpandableListView .
  • SubGroup mantendría otros ExpandableListView excepto los dos últimos, que siempre serán ChildViews . (Estoy pensando que esos dos podrían ser sustituidos con el de SubSubGroup )
  • SubSubGroup sostendría ChildViews .

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

Intenté simplemente agregar un ExpandableListView como un elemento secundario en otro, pero algo no funciona, ya que solo se puede ver el primer elemento del ExpandableListView interno si se expande uno de los grupos externos. Sin embargo, al establecer la altura del contenedor de grupos externos, puedo hacerlo manualmente lo suficientemente grande como para mostrar todos los elementos en el ExpandableListView interno. Para ser óptimo, el cálculo de la altura, por supuesto, debe hacerse sobre la marcha.

Entonces, para llegar a algunas preguntas más sólidas:

  • Alguien me puede dar una explicación del "ciclo de vida" de ExpandableListView (con esto me refiero a la creación de instancias, la reutilización de vistas, expandir / contraer oyentes), incluyendo:
    • ¿Cómo y cuándo se notifica a ExpandableListView que un niño está expandido / contraído?
    • ¿Cómo sabe ExpandableListView cuánto espacio hay para hacer que todos los niños encajen en un contenedor de grupo?
  • ¿Qué beneficio tiene utilizar ExpandableListView para crear lo anterior, en comparación con solo mezclar mi propia solución utilizando algunos LinearLayouts y algunos OnClickListeners ?

Editar

Para mi última pregunta, debo señalar que puede haber desde 1 hasta 20 MainGroups .


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

aqui esta 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 se encuentra debajo de la carpeta de colores para cambiar el color del texto. Ya lo dejó, incluso puede cambiar el fondo para obtener un mejor aspecto.

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>

espero que funcione...


En primer lugar, déjame recomendarte el sitio de GrepCode . Tiene fuentes de clases de Android SDK. Gracias por ellos, he descubierto los principios básicos de AdapterViews (te di un enlace a ExpandableListView, pero es mejor si lo investigas no solo, sino también a sus padres de clase).

Ahora, tus preguntas y mis respuestas:

¿Cómo y cuándo se notifica a ExpandableListView que un niño está expandido / contraído?

Consulte el método handleItemClick (Ver v, posición int, id larga)

¿Cómo sabe ExpandableListView cuánto espacio hay para hacer que todos los niños encajen en un contenedor de grupo?

No investigué bien esta pregunta, pero hasta donde 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).

¿Qué beneficio tiene utilizar ExpandableListView para crear lo anterior, en comparación con solo mezclar mi propia solución utilizando algunos LinearLayouts y algunos OnClickListeners?

Las vistas de Adapter son más rápidas. Pero tu construcción es demasiado compleja incluso para ExpandableListView. Puede utilizar 2 soluciones.

  1. Guru-solution: si eres profesional en el diseño de tus propias Vistas / Grupos de Vistas desde el principio (es decir, entiendes los métodos requestLayout (), dispatchDraw (), etc.), luego escribe tu propio GrandExpandableListAdapter con 3 niveles.
  2. Solución mediana: use ExpandableListAdapter para los primeros 2 niveles y use LinearLayouts para el 3er nivel.

Es posible que desee comprobar this proyecto. No lo he intentado, pero creo que vale la pena intentarlo. El ExpanadableListView predeterminado es bastante limitado, diseñado originalmente para soportar solo 2 niveles. Puedes piratearlo para que soporte más niveles que eso, pero se ensuciará.