Blog para desarrollo de aplicaciones en Android, aprende paso a paso como crear aplicaciones.

Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación para mostrarle publicidad personalizada y realizar análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. OK Más información | Y más

Como crear un ExpandableListView en Android

Android Studio - ExpandableListView

Hola amigos hemos llegado lejos ya creciendo cada día mas en conocimiento, espero que todo sea claro para ustedes y si tienen dudas como siempre dejar su comentario y responderé cualquier duda que tengan.

Bueno comenzamos con este tutorial en esta ocasión les traigo el siguiente Container ExpandableListView se utiliza para agrupar los datos de la lista por categorías. Tiene la capacidad de expandir y contraer los grupos cuando el usuario toca la cabecera.


Crear Nuevo Proyecto Android Studio

Para comenzar necesitamos crear nuestro proyecto puedes verificar el siguiente enlace (Aquí) para saber como se logra hacer y seguir con este ejemplo del uso del ExpandableLisView.

Diseño de Aplicación Layout

Ahora comenzaremos con el diseño de nuestra aplicación presta mucha atención en el proceso para que puedas entender lo que estoy haciendo. Continuamos.

El Container lo encontraremos en la sección de Containers.


Ahora colocaremos nuestro Container en nuestro activity_main.xml.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#f4f4f4" >

    <ExpandableListView
        android:id="@+id/ExpandableListView"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</LinearLayout>

Seguiremos agregando otro Layout.xml ya que este control funciona de forma agrupada. Es de los controles que necesita complementos combinados para funcionar.

Para ello nos vamos a la sección siguiente.

Presionamos clic derecho sobre el directorio layout.
Le pondremos lista_encabezado.xml nos aseguramos que en RootElement sea un LinearLayout.
Presionamos Ok. y listo tendríamos agregado nuestro layout. Agregamos un textView para que este contenga el nombre de los encabezados. Nos quedaría de la siguiente forma.
El código de este layout es el siguiente.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp"
    android:background="#000000">


    <TextView
        android:id="@+id/lblListHeader"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textSize="17dp"
        android:text="Encabezado"
        android:textColor="#f9f93d" />

</LinearLayout>

Ahora agregaremos el layout encargado de contener las filas que serian los nodos hijos en nuestra lista desplegable. De igual manera que el anterior agregamos el layout nos aseguramos de que sea un LinearLayout y le pondremos lista_contenido.xml. el código de nuestro Layout seria el siguiente.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="55dip"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/lblListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="17dip"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" />

</LinearLayout>

Y con esto quedaría listo nuestro diseño para nuestra aplicación.

Código MainAcitivity

Comenzaremos ahora con el código de nuestra aplicación. Agregaremos una clase que necesitaremos para el adaptador de nuestro ExpandableListView, los pasos son los siguientes. nos dirigimos a la sección donde se encuentran las clases java.
En el paquete de nuestro proyecto presionaremos clic derecho.
Presionaremos Java Class y nos mostrara la siguiente ventana.
Escribiremos el nombre de nuestra clase ExpandableListAdapter y presionamos Ok. Teniendo lista nuestra clase comenzaremos con la programación de la misma.

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {
    //--Declaramos las variables que utilizaremos
    private Context _context;
    private List<String> _listDataHeader;
    private HashMap<String, List<String>> _listDataChild;
    //--Constructor de nuestra clase
    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        //--Asigna las variables los datos recibidos
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }
    //--Retorna la posicion del encabezado
    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }
    //--Retorna la posicoin del indice del contenido
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
    //--Funcion donde se asignara el contenido
    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        //--Declaramos la variable que tomara la posiciones
        final String childText = (String) getChild(groupPosition, childPosition);
        //--Verifica el layout para generar el diseño
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.lista_contenido, null);
        }
        //--Asigana las propiedades del control textView que se encuentra en el Layout lista_contenido
        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);
        //--Asigna el valor recibido en el textView
        txtListChild.setText(childText);
        //--Retorna el diseño
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
    //--Funcion para agregar el encabezado
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        //--Variable que toma la posicion del encabezado
        String headerTitle = (String) getGroup(groupPosition);
        //--Verifica la variable de diseño para el layout
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //--Asigna el Layout lista_encabezado
            convertView = infalInflater.inflate(R.layout.lista_encabezado, null);
        }
        //--Asigna las propiedades del textView en el layaout lista_encabezado
        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        //--Asigna el valor al textview
        lblListHeader.setText(headerTitle);
        //--Retorna la variable para generar el diseño
        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

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

Ahora continuamos con nuestra clase principal MainActivity el código de la clase sería el siguiente.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;

public class MainActivity extends Activity {
    //--Declaramos las variables que utilizaremos
    //--Variable para acceder a nuestra clase Adapter
    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //--Asignamos las propiedades de nuestra ExpandableListView a la variable
        expListView = (ExpandableListView) findViewById(R.id.ExpandableListView);
        //--Funcion para preprar el contenido de nuestro lista
        prepareListData();
        //--Enviamos los valores a nuestra clase ExpandableListAdapter que generara el diseño
        listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);
        //--Asigamos el resultado de nuestro Container ExpandableListView
        expListView.setAdapter(listAdapter);
    }
    //--Funcion que genera el contenido
    private void prepareListData() {
        //--Variables que utilizaremos para definir el encabezado y el contenido
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();

        //--Asignamos los valores que iran en el encabezado
        listDataHeader.add("Verduras");
        listDataHeader.add("Frutas");
        listDataHeader.add("Golosinas");

        //--Añadimos el contenido
        List<String> Verduras = new ArrayList<String>();
        Verduras.add("La Zanahoria");
        Verduras.add("La Cebolla");
        Verduras.add("El Tomate");
        Verduras.add("La Lechugan");
        Verduras.add("El Nabo");
        Verduras.add("Las Espinacas");

        List<String> Frutas = new ArrayList<String>();
        Frutas.add("La Manzana");
        Frutas.add("La Sandia");
        Frutas.add("La Pera");
        Frutas.add("La Piña");
        Frutas.add("Las Cerezas");
        Frutas.add("Las Fresas");

        List<String> Golosinas = new ArrayList<String>();
        Golosinas.add("Chocolates");
        Golosinas.add("Caramelos");
        Golosinas.add("Icre Cream");
        Golosinas.add("Algodon Azucar");
        //--Asignamos el contenido al nodo que representa el indice del encabezado
        listDataChild.put(listDataHeader.get(0), Verduras);
        listDataChild.put(listDataHeader.get(1), Frutas);
        listDataChild.put(listDataHeader.get(2), Golosinas);
    }
}

Y de esta forma quedaría todo. Si no entiendes alguna parte escríbeme tu comentario. Con esto quedaría todo listo.

Crear Emulador AVD (Aquí)

Crearemos el emulador AVD para ver el resultado de nuestra aplicación.

Ejecutamos Aplicación Android

Ahora ejecutamos nuestra aplicación para ver el resultado de nuestro ejemplo del uso del ExpandablelistView.
Y este seria el resultado. Puede probar creando tus propios diseños y presentaciones practica para que entiendas como funciona. Y prueba lo en tus aplicaciones.

Descargar: Aquí

Espero el contenido haya sido claro cualquier duda déjame tu comentario y con gusto te responderé. Gracias por tu tiempo.

Si deseas empezar y desarrollar algo grandioso, no necesitas millones de dólares de capitalización. Necesitas suficiente pizza y Diet Coke en la nevera, una PC barata y trabajo y dedicación para realizar tu idea. (John Carmack).

Android Studio - Curso Español

Android Studio - Curso Español

No hay comentarios:

Publicar un comentario

x

Registrate!

Curso Android Español

Curso Kotlin Español

eBook Free Android Studio

Noticias y Eventos

¡Directamente a tu INBOX!

Le enviaremos nuestros recursos gratis. Para obtener nuestro contenido nuevo, únase a nuestra comunidad. No te molestaremos enviando información inútil. ¡No te pierdas ninguna actualización, mantente conectado! Recuerda verificar tu correo electronico.

Ingrese su dirección de correo electrónico:

Entregado por FeedBurner