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é
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