BaseExpandableListAdapter en Android con ejemplo

En muchas aplicaciones de Android, es posible que el desarrollador deba mostrar múltiples datos para elementos de datos principales enormes. es decir, según nuestro ejemplo, en «Lenguajes de programación», debemos mostrar «Python», «Java», etc., y en «Base de datos relacional» debemos mostrar «Oracle», «MySQL», etc. Para ese propósito, podemos usar “ BaseExpandableListAdapter “. Es un puente entre el componente de la interfaz de usuario y la fuente de datos que completa los datos en el componente de la interfaz de usuario. Contiene los datos y luego los envía a la vista del Adaptador, luego la vista puede tomar los datos de la vista del Adaptador y muestra los datos en diferentes vistas como ExpandableListView. Proporcionará acceso a los datos de los niños (categorizados por grupos), y también instanciará vistas para los niños y grupos.

BaseExpandableListAdapter in Android

Veamos a través del código. Aquí está el fragmento de código para el archivo CustomAdapter.java :

Java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import java.util.ArrayList;
  
public class CustomizedAdapter extends BaseExpandableListAdapter {
  
    private Context context;
    private ArrayList<GroupInformation> mainSetName;
  
    public CustomizedAdapter(Context context, ArrayList<GroupInformation> deptList) {
        this.context = context;
        this.mainSetName = deptList;
    }
  
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        ArrayList<ChildInfo> productList = mainSetName.get(groupPosition).getSubsetName();
        return productList.get(childPosition);
    }
  
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
  
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                             View view, ViewGroup parent) {
  
        ChildInfo detailInfo = (ChildInfo) getChild(groupPosition, childPosition);
        if (view == null) {
            LayoutInflater infalInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = infalInflater.inflate(R.layout.child_items, null);
        }
        TextView childItem = (TextView) view.findViewById(R.id.childItm);
        childItem.setText(detailInfo.getName().trim());
  
        return view;
    }
  
    @Override
    public int getChildrenCount(int groupPosition) {
  
        ArrayList<ChildInfo> productList = mainSetName.get(groupPosition).getSubsetName();
        return productList.size();
  
    }
  
    @Override
    public Object getGroup(int groupPosition) {
        return mainSetName.get(groupPosition);
    }
  
    @Override
    public int getGroupCount() {
        return mainSetName.size();
    }
  
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
  
    @Override
    public View getGroupView(int groupPosition, boolean isLastChild, View view,
                             ViewGroup parent) {
  
        GroupInformation headerInfo = (GroupInformation) getGroup(groupPosition);
        if (view == null) {
            LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inf.inflate(R.layout.group_items, null);
        }
  
        TextView heading = (TextView) view.findViewById(R.id.data);
        heading.setText(headerInfo.getName().trim());
  
        return view;
    }
  
    @Override
    public boolean hasStableIds() {
        return true;
    }
  
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
  
}

Consulte los métodos getChildView() y getGroupView() . Se utilizan para crear la Vista correspondiente al diseño.

Método 1: 

getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)

Explicación: se usa para crear una vista secundaria significa un elemento secundario para un padre o grupo

Parámetros:

groupPosition: Posición para el padre (grupo) del hijo actual. La función devuelve un valor de tipo entero. Por ejemplo: Programación_Lenguajes

childPosition: posición para el elemento secundario actual del padre.

isLastChild: devuelve verdadero/falso porque el elemento secundario actual es el último elemento secundario dentro de su grupo.

convertView: devuelve View, que se utiliza para establecer el diseño de los elementos secundarios.

Principal: establezca la vista para el elemento principal o de grupo. El padre eventual de esta nueva Vista.

Método 2: 

Ver getGroupView(int groupPosition, boolean isExpanded, Ver convertView, ViewGroup parent)

Explicación: Se usa para crear nuestro grupo o vista principal

Parámetros:

groupPosition: Indica la posición del padre o grupo del hijo. El tipo de retorno es un número entero.

isExpanded: Para indicar si el grupo se expandió y si es así devuelve verdadero o falso.

convertView : devuelve la vista que se utiliza para establecer el diseño de los elementos del grupo.

Principal : se utiliza para configurar la vista del elemento principal o del grupo. El padre eventual de esta nueva Vista.

Método 3: 

getChild(int posicióngrupo, int posiciónniño)

Explicación: Obtiene los datos asociados con el niño dado dentro del grupo dado.

Parámetros:

groupPosition : indica la posición del padre o grupo del hijo y devuelve un valor de tipo entero.

childPosition : indica la posición del hijo del grupo dado y devuelve un valor de tipo entero.

Método 4:

getGroup(int grupoPosición)

Explicación: Obtiene los datos asociados con el grupo dado.

Parámetros:

groupPosition: indica la posición del padre o grupo del hijo y devuelve un valor de tipo entero.

Método 5:

getChildrenCount(int grupoPosición)

Explicación: Obtiene el número de niños en un grupo especificado.

Parámetros:

groupPosition : Indica la posición del padre o grupo del hijo y al usar esa posición calculamos el número de hijos en ese grupo.

Método 6:

obtenerCuentaGrupo()

Explicación: Obtenga el número total de grupos.

Método 7:

getGroupId(int grupoPosición)

Explicación: Obtenga la ID del grupo en la posición dada.

Parámetros:

groupPosition: Indica la posición del padre o grupo del hijo y al usar esa posición obtenemos la ID del grupo.

Método 8:

getChildId(int posición del grupo, int posición del niño)

Explicación: Para obtener la identificación del niño dado dentro del grupo dado.

Parámetros:

groupPosition: indica la posición del padre o grupo del hijo y devuelve un valor de tipo entero.

childPosition: indica la posición del hijo del grupo dado y devuelve un valor de tipo entero.

Método 9: 

isChildSelectable(int groupPosition, int childPosition)

Explicación: Comprueba si el elemento secundario en la posición especificada es seleccionable o no y devuelve un valor booleano

Parámetros:

groupPosition: indica la posición del padre o grupo del hijo y devuelve un valor de tipo entero.

childPosition : indica la posición del elemento secundario del grupo dado y devuelve un valor de tipo entero. Al usar ese valor, verificamos si el elemento secundario es seleccionable o no.

Ejemplo

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: trabajar con el archivo activity_main.xml

Vaya al archivo activity_main.xml y consulte el siguiente código. A continuación se muestra el código para el archivo activity_main.xml .

XML

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    android:orientation="vertical">
  
    <ExpandableListView
        android:id="@+id/simpleExpandableListView1"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:divider="#0f0"
        android:dividerHeight="2dp" />
  
</RelativeLayout>

Paso 3: Crear nuevos archivos XML

Vaya a la aplicación > res > diseño > haga clic con el botón derecho en > Nuevo > Archivo de recursos de diseño y nombre el archivo como child_items . A continuación se muestra el código para el archivo child_items.xml . Aquí TextView se usa para un subconjunto de elementos, por ejemplo: Python .

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:orientation="vertical">
  
    <TextView
        android:id="@+id/childItm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="15dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />
  
</RelativeLayout>

Del mismo modo, cree otro archivo de recursos de diseño y asígnele el nombre group_items . A continuación se muestra el código para el archivo group_items.xml . Aquí TextView se usa para el conjunto principal de elementos, por ejemplo: Programming_Languages

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="55dip"
    android:orientation="vertical">
  
    <TextView
        android:id="@+id/data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="35sp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold" />
  
</LinearLayout>

Paso 4: Crear nuevos archivos Java

Vaya a la aplicación > java > el nombre de su paquete > haga clic con el botón derecho en > Nuevo > Java Classe y nombre el archivo como ChildInfo . A continuación se muestra el código para el archivo ChildInfo.java .

Java

public class ChildInfo {
    private String name = "";
      
    // Getter , setter methods
    public String getName() {
        return name;
    }
  
    public void setName(String name) {
        this.name = name;
    }
}

Del mismo modo, cree otro archivo de clase Java y nombre el archivo como CustomAdapter . Hemos discutido esto en la sección inicial y también cada método anulado. Entonces puede copiar el mismo código e implementarlo en el proyecto.

Ahora cree otro archivo java y nombre el archivo como GroupInformation . A continuación se muestra el código para el archivo GroupInformation.java .

Java

import java.util.ArrayList;
  
public class GroupInformation {
  
    private String mainSetName;
    private ArrayList<ChildInfo> list = new ArrayList<ChildInfo>();
  
    public String getName() {
        return mainSetName;
    }
  
    public void setName(String mainSetName) {
        this.mainSetName = mainSetName;
    }
  
    public ArrayList<ChildInfo> getSubsetName() {
        return list;
    }
  
    public void setSubsetName(ArrayList<ChildInfo> subSetName) {
        this.list = subSetName;
    }
  
}

Paso 5: trabajar con el archivo MainActivity.java

Vaya al archivo MainActivity.java y consulte el siguiente código. 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.ExpandableListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.LinkedHashMap;
  
public class MainActivity extends AppCompatActivity {
  
    private LinkedHashMap<String, GroupInformation> mainSet = new LinkedHashMap<String, GroupInformation>();
    private ArrayList<GroupInformation> subSet = new ArrayList<GroupInformation>();
  
    private CustomizedAdapter listAdapter;
    private ExpandableListView simpleExpandableListView1;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // add data for displaying in expandable list view
        loadData();
  
        // get reference of the ExpandableListView from activity_main
        simpleExpandableListView1 = (ExpandableListView) findViewById(R.id.simpleExpandableListView1);
          
        // create the adapter and by passing your ArrayList data
        listAdapter = new CustomizedAdapter(MainActivity.this, subSet);
        simpleExpandableListView1.setAdapter(listAdapter);
  
        // setOnChildClickListener listener for child row click, so that we can get the value
        simpleExpandableListView1.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                // get the group header
                GroupInformation headerInfo = subSet.get(groupPosition);
                // get the child info
                ChildInfo detailInfo = headerInfo.getSubsetName().get(childPosition);
                // display it or do something with it
                Toast.makeText(getBaseContext(), headerInfo.getName() + "/" + detailInfo.getName(), Toast.LENGTH_LONG).show();
                return false;
            }
        });
          
        // setOnGroupClickListener listener for group heading click
        simpleExpandableListView1.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                // get the group header
                GroupInformation headerInfo = subSet.get(groupPosition);
                // display it or do something with it
                Toast.makeText(getBaseContext(), headerInfo.getName(), Toast.LENGTH_LONG).show();
                return false;
            }
        });
    }
  
    // load some initial data into out list
    private void loadData() {
  
        addDetails("Programming_Languages", "Python");
        addDetails("Programming_Languages", "Java");
        addDetails("Programming_Languages", "Kotlin");
        addDetails("Programming_Languages", "NodeJS");
        addDetails("Programming_Languages", "GO");
  
        addDetails("Relational_Database", "Oracle");
        addDetails("Relational_Database", "SQLServer");
        addDetails("Relational_Database", "MySQL");
  
        addDetails("NoSQL_Database", "MongoDB");
        addDetails("NoSQL_Database", "Cassandra");
        addDetails("NoSQL_Database", "CouchDB");
  
    }
      
    // here we maintain main set like Programming languages and subsets like Python
    private int addDetails(String mainSet, String subSet) {
  
        int groupPosition = 0;
  
        // check the hash map if the group already exists
        GroupInformation headerInfo = this.mainSet.get(mainSet);
          
        // add the group if doesn't exists
        if (headerInfo == null) {
            headerInfo = new GroupInformation();
            headerInfo.setName(mainSet);
            this.mainSet.put(mainSet, headerInfo);
            this.subSet.add(headerInfo);
        }
  
        // get the children for the group
        ArrayList<ChildInfo> subList = headerInfo.getSubsetName();
          
        // size of the children list
        int listSize = subList.size();
          
        // add to the counter
        listSize++;
  
        // create a new child and add that to the group
        ChildInfo detailInfo = new ChildInfo();
        detailInfo.setName(subSet);
        subList.add(detailInfo);
        headerInfo.setSubsetName(subList);
  
        // find the group position inside the list
        groupPosition = this.subSet.indexOf(headerInfo);
        return groupPosition;
    }
}

Producción:

Al ejecutar la aplicación, en el emulador, podemos ver la salida como se adjunta en el video. Esta función es muy necesaria en muchas aplicaciones.

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 *