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