SimpleExpandableListAdapter en Android con ejemplo

Android ExpandableListView es una vista que se usa para mostrar elementos como una lista de dos niveles con desplazamiento vertical. La diferencia básica con ListView es que permite dos niveles de visualización, que son grupos que se pueden expandir y contraer fácilmente tocando para ver y sus respectivos elementos secundarios. Para mostrar la vista, se usa ExpandableListViewAdapter en android. En muchas aplicaciones, se requiere una función ExpandableListView. Por ejemplo:

  • En una aplicación de «ciudad» (para cualquier ciudad), si el usuario desea ver una lista de facultades de ingeniería/lista de facultades de arte/lista de facultades de medicina, etc.,
  • Lista de verduras/Lista de frutas/Lista de frutos secos, etc., para una aplicación tipo “jiomart”
  • Lista de Hatchback/Lista de Crosscut/Lista de Sedan, etc., para una aplicación tipo “Uber”

Métodos importantes

Métodos

Descripción

setChildIndicator(Dibujable)

Indicador de estado actual para cada elemento Si el niño es 

el último hijo de un grupo, se establecerá el estado state_last

setGroupIndicator(Dibujable)

Para representar el estado expandido o colapsado. state_expanded es el

state si el grupo está expandido, state_collapsed si el estado del grupo 

está contraído, state_empty si no hay grupos.

obtenerVistaDeGrupo() Se utiliza para obtener la vista del encabezado del grupo de listas.
getChildView() Se utiliza para obtener la vista del elemento secundario de la lista

Las interfaces notables

Interfaces

Descripción

ExpandableListView.OnChildClickListener Cuando se hace clic en un niño en la lista expandida, esto se anula
ExpandableListView.OnGroupClickListener Cuando se hace clic en un encabezado de grupo en la lista expandida, esto se anula
ExpandableListView.OnGroupCollapseListener Cuando un grupo está colapsado, este método notifica
ExpandableListView.OnGroupExpandListener Cuando se expande un grupo, este método notifica

Ejemplo

Veamos las formas de implementar SimpleExpandableListAdapter en Android con una Lista de verduras/Lista de frutas/Lista de frutos secos en el ExpandableListAdapter. qué

SimpleExpandableListAdapter

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.

Paso 2: Cree el archivo dimens.xml

Vaya a aplicación > res > valores > haga clic con el botón derecho en > Nuevo > Archivo de recursos de valores y nombre el archivo como dimens. En este archivo, la información relacionada con la dimensión se proporciona aquí. A continuación se muestra el código para el archivo dimens.xml .

XML

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>

Paso 3: trabajar con los archivos XML

  • Para diseñar la interfaz de usuario, el código está presente en la carpeta res\layout en forma de XML. Se utilizan en los archivos de actividad y una vez que el archivo XML está dentro del alcance de la actividad, se puede acceder a los componentes presentes en el XML. A continuación se muestra el código para el archivo activity_main.xml . Se agregan comentarios dentro del código para comprender el código con más detalle.

XML

<!-- RelativeLayout places the components vertically one by one.
     Necessary parameters also specified so that elegant output can be seen -->
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">
  
    <!-- ExpandableListView is used in relativelayout
         The android:indicatorLeft is the left bound for an items indicator.-->
    <ExpandableListView
        android:id="@+id/expandableListViewSample"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="0.5dp"
        android:indicatorLeft="?android:attr/expandableListPreferredItemIndicatorLeft" />
  
</RelativeLayout>
<!-- Note: We cannot use the value wrap_content for the android:layout_height
     attribute of the ExpandableListView in XML. -->
  • Vaya a app > res > layout > New > Layout Resource File y nombre el archivo como list_group. A continuación se muestra el código para el archivo list_group.xml .

XML

<?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="match_parent"
    android:orientation="vertical">
  
    <TextView
        android:id="@+id/listTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:textColor="@android:color/black" />
      
</LinearLayout>
  • El siguiente es para la fila de diseño para elementos secundarios. Esto se hace a través de un archivo list_item.xml . Vaya a aplicación > res > diseño > Nuevo > Archivo de recursos de diseño y nombre el archivo como list_item . A continuación se muestra el código para el archivo list_item.xml .

XML

<?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="wrap_content"
    android:orientation="vertical">
  
    <TextView
        android:id="@+id/expandedListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
        android:paddingTop="10dp"
        android:paddingBottom="10dp" />
      
</LinearLayout>
  • Con el XML anterior, los elementos de diseño de la interfaz de usuario están completos. Lo siguiente es un archivo Java para completar el contenido de la lista.

Paso 4: Trabajar con los archivos Java

  • Vaya a aplicación > Java > el nombre de su paquete > Haga clic con el botón derecho en > Nuevo > Clase Java y nombre el archivo como ExpandableListDataItems. A continuación se muestra el código del archivo ExpandableListDataItems.java . Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
  
public class ExpandableListDataItems {
    public static HashMap<String, List<String>> getData() {
        HashMap<String, List<String>> expandableDetailList = new HashMap<String, List<String>>();
  
        // As we are populating List of fruits, vegetables and nuts, using them here
        // We can modify them as per our choice.
        // And also choice of fruits/vegetables/nuts can be changed
        List<String> fruits = new ArrayList<String>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Guava");
        fruits.add("Papaya");
        fruits.add("Pineapple");
  
        List<String> vegetables = new ArrayList<String>();
        vegetables.add("Tomato");
        vegetables.add("Potato");
        vegetables.add("Carrot");
        vegetables.add("Cabbage");
        vegetables.add("Cauliflower");
  
        List<String> nuts = new ArrayList<String>();
        nuts.add("Cashews");
        nuts.add("Badam");
        nuts.add("Pista");
        nuts.add("Raisin");
        nuts.add("Walnut");
  
        // Fruits are grouped under Fruits Items. Similarly the rest two are under
        // Vegetable Items and Nuts Items respecitively.
        // i.e. expandableDetailList object is used to map the group header strings to
        // their respective children using an ArrayList of Strings.
        expandableDetailList.put("Fruits Items", fruits);
        expandableDetailList.put("Vegetable Items", vegetables);
        expandableDetailList.put("Nuts Items", nuts);
        return expandableDetailList;
    }
}
  • Vaya a aplicación > Java > el nombre de su paquete > Haga clic con el botón derecho en > Nuevo > Clase Java y asigne al archivo el nombre de Adaptador de lista expandible personalizado. A continuación se muestra el código para el archivo CustomizedExpandableListAdapter.java . Esta clase Java amplía BaseExpandableListAdapter y anula los métodos necesarios para ExpandableListView. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

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;
import java.util.HashMap;
import java.util.List;
  
public class CustomizedExpandableListAdapter extends BaseExpandableListAdapter {
  
    private Context context;
    private List<String> expandableTitleList;
    private HashMap<String, List<String>> expandableDetailList;
  
    // constructor
    public CustomizedExpandableListAdapter(Context context, List<String> expandableListTitle,
                                           HashMap<String, List<String>> expandableListDetail) {
        this.context = context;
        this.expandableTitleList = expandableListTitle;
        this.expandableDetailList = expandableListDetail;
    }
  
    @Override
    // Gets the data associated with the given child within the given group.
    public Object getChild(int lstPosn, int expanded_ListPosition) {
        return this.expandableDetailList.get(this.expandableTitleList.get(lstPosn)).get(expanded_ListPosition);
    }
  
    @Override
    // Gets the ID for the given child within the given group.
    // This ID must be unique across all children within the group. Hence we can pick the child uniquely
    public long getChildId(int listPosition, int expanded_ListPosition) {
        return expanded_ListPosition;
    }
  
    @Override
    // Gets a View that displays the data for the given child within the given group.
    public View getChildView(int lstPosn, final int expanded_ListPosition, 
                             boolean isLastChild, View convertView, ViewGroup parent) {
        final String expandedListText = (String) getChild(lstPosn, expanded_ListPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_item, null);
        }
        TextView expandedListTextView = (TextView) convertView.findViewById(R.id.expandedListItem);
        expandedListTextView.setText(expandedListText);
        return convertView;
    }
  
    @Override
    // Gets the number of children in a specified group.
    public int getChildrenCount(int listPosition) {
        return this.expandableDetailList.get(this.expandableTitleList.get(listPosition)).size();
    }
  
    @Override
    // Gets the data associated with the given group.
    public Object getGroup(int listPosition) {
        return this.expandableTitleList.get(listPosition);
    }
  
    @Override
    // Gets the number of groups.
    public int getGroupCount() {
        return this.expandableTitleList.size();
    }
  
    @Override
    // Gets the ID for the group at the given position. This group ID must be unique across groups.
    public long getGroupId(int listPosition) {
        return listPosition;
    }
  
    @Override
    // Gets a View that displays the given group.
    // This View is only for the group--the Views for the group's children
    // will be fetched using getChildView()
    public View getGroupView(int listPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        String listTitle = (String) getGroup(listPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_group, null);
        }
        TextView listTitleTextView = (TextView) convertView.findViewById(R.id.listTitle);
        listTitleTextView.setTypeface(null, Typeface.BOLD);
        listTitleTextView.setText(listTitle);
        return convertView;
    }
  
    @Override
    // Indicates whether the child and group IDs are stable across changes to the underlying data.
    public boolean hasStableIds() {
        return false;
    }
  
    @Override
    // Whether the child at the specified position is selectable.
    public boolean isChildSelectable(int listPosition, int expandedListPosition) {
        return true;
    }
}
  •  A continuación se muestra el código del archivo MainActivity.java . Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
  
public class MainActivity extends AppCompatActivity {
  
    ExpandableListView expandableListViewExample;
    ExpandableListAdapter expandableListAdapter;
    List<String> expandableTitleList;
    HashMap<String, List<String>> expandableDetailList;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        expandableListViewExample = (ExpandableListView) findViewById(R.id.expandableListViewSample);
        expandableDetailList = ExpandableListDataItems.getData();
        expandableTitleList = new ArrayList<String>(expandableDetailList.keySet());
        expandableListAdapter = new CustomizedExpandableListAdapter(this, expandableTitleList, expandableDetailList);
        expandableListViewExample.setAdapter(expandableListAdapter);
  
        // This method is called when the group is expanded
        expandableListViewExample.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {
                Toast.makeText(getApplicationContext(), expandableTitleList.get(groupPosition) + " List Expanded.", Toast.LENGTH_SHORT).show();
            }
        });
  
        // This method is called when the group is collapsed
        expandableListViewExample.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
            @Override
            public void onGroupCollapse(int groupPosition) {
                Toast.makeText(getApplicationContext(), expandableTitleList.get(groupPosition) + " List Collapsed.", Toast.LENGTH_SHORT).show();
            }
        });
  
        // This method is called when the child in any group is clicked
        // via a toast method, it is shown to display the selected child item as a sample
        // we may need to add further steps according to the requirements
        expandableListViewExample.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                                        int groupPosition, int childPosition, long id) {
                Toast.makeText(getApplicationContext(), expandableTitleList.get(groupPosition)
                                + " -> "
                                + expandableDetailList.get(
                                expandableTitleList.get(groupPosition)).get(
                                childPosition), Toast.LENGTH_SHORT
                ).show();
                return false;
            }
        });
    }
}

Salida: ejecutar en emulador

Conclusión

ExpandableListView es una característica obligatoria muy útil que se usa en muchas aplicaciones. En los tamaños de las aplicaciones móviles y en el espacio disponible, para mostrar varios elementos, uno debería necesitar características como ExpandableListView y ExpandableListAdapter, la vista se puede ajustar perfectamente. Como el desplazamiento está disponible, podemos mantener la información en muchos niveles. Los métodos admiten expandir el encabezado, colapsar el encabezado, seleccionar los elementos secundarios perfectamente como se ve en la salida del emulador. Para simplificar, hemos proporcionado mensajes Toast. Dependiendo de los requisitos, podemos agregar más codificación para que coincida con él.

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *