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 otrosExpandableListView
. -
SubGroup
mantendría otrosExpandableListView
excepto los dos últimos, que siempre seránChildViews
. (Estoy pensando que esos dos podrían ser sustituidos con el deSubSubGroup
) -
SubSubGroup
sostendríaChildViews
.
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?
- ¿Cómo y cuándo se notifica a
- ¿Qué beneficio tiene utilizar
ExpandableListView
para crear lo anterior, en comparación con solo mezclar mi propia solución utilizando algunosLinearLayouts
y algunosOnClickListeners
?
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.
- 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.
- 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á.