ExpandableListView dentro de una vista de desplazamiento

En mi aplicación quiero hacer una página que tiene ExpandableListView y debajo de él CheckBox.

Mi problema es que mi ExpandableListView es demasiado grande y hacer el CheckBox fuera de la página.

En pantallas más pequeñas no es visible en absoluto.

He intentado poner ExpandableListView dentro de scrollview pero no funciona.

¿Hay una manera de hacer mi diseño?

Aquí está mi código y una captura de pantalla.

Código 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/White" > <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="15sp" android:text="In this page you can save a group of exercise under one routine." android:textColor="@color/Black" android:textSize="20sp" /> <ExpandableListView android:id="@+id/instructionsExView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView1" android:layout_marginTop="15sp" > </ExpandableListView> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/instructionsExView" android:layout_marginTop="15sp" android:text="If you want to open the instruction again check &apos;need help?&apos;" android:textColor="@color/Black" android:textSize="20sp" /> <CheckBox android:id="@+id/checkInstructions" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView2" android:layout_marginTop="16dp" android:checked="false" android:text="dont show again when opening the page" android:textColor="@color/Black" /> </RelativeLayout> </ScrollView> </RelativeLayout> 

Captura de pantalla:

introduzca la descripción de la imagen aquí

EDITAR:

introduzca la descripción de la imagen aquí

5 Solutions collect form web for “ExpandableListView dentro de una vista de desplazamiento”

en su método "onCreate" escriba: "setListViewHeight (expListView)" después de "expListView.setAdapter (listAdapter)" y luego configure OnGroupClickListener para su vista de lista expandible como se muestra a continuación:

 expListView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { setListViewHeight(parent, groupPosition); return false; } }); 

métodos utilizados:

 private void setListViewHeight(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); } private void setListViewHeight(ExpandableListView listView, int group) { ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter(); int totalHeight = 0; int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.EXACTLY); for (int i = 0; i < listAdapter.getGroupCount(); i++) { View groupItem = listAdapter.getGroupView(i, false, null, listView); groupItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); totalHeight += groupItem.getMeasuredHeight(); if (((listView.isGroupExpanded(i)) && (i != group)) || ((!listView.isGroupExpanded(i)) && (i == group))) { for (int j = 0; j < listAdapter.getChildrenCount(i); j++) { View listItem = listAdapter.getChildView(i, j, false, null, listView); listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); totalHeight += listItem.getMeasuredHeight(); } } } ViewGroup.LayoutParams params = listView.getLayoutParams(); int height = totalHeight + (listView.getDividerHeight() * (listAdapter.getGroupCount() - 1)); if (height < 10) height = 200; params.height = height; listView.setLayoutParams(params); listView.requestLayout(); } 

ahora u son buenos para ir.

Basado en la respuesta de @ Dmila Ram , pude hacerlo.

En mi caso, inicializo y onCreate el ExpandableListView en el método onCreate así:

 expandableListView = (ExpandableListView) findViewById(R.id.appsMenu); listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); expandableListView.setAdapter(listAdapter); for (int i = 0; i < listAdapter.getGroupCount(); i++) expandableListView.expandGroup(i); setListViewHeight(expandableListView); expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { setListViewHeight(parent, groupPosition); return false; } }); 

Tenga en cuenta que amplío cada grupo. Después llamo setListViewHeight(expandableListView);

Este método es responsable de calcular la altura del ExpandableListView cuando se crea por primera vez.

Aquí está el código:

 private void setListViewHeight(ExpandableListView listView) { ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter(); int totalHeight = 0; for (int i = 0; i < listAdapter.getGroupCount(); i++) { View groupView = listAdapter.getGroupView(i, true, null, listView); groupView.measure(0, View.MeasureSpec.UNSPECIFIED); totalHeight += groupView.getMeasuredHeight(); if (listView.isGroupExpanded(i)){ for(int j = 0; j < listAdapter.getChildrenCount(i); j++){ View listItem = listAdapter.getChildView(i, j, false, null, listView); listItem.measure(0, View.MeasureSpec.UNSPECIFIED); totalHeight += listItem.getMeasuredHeight(); } } } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getGroupCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); } 

En realidad, no es necesario que los grupos se expandan, sino que simplemente podemos pasar por los elementos secundarios y agregarlos al cálculo de la altura total.

Esto hará que todos los widgets en ScrollView puedan desplazarse y también mostrará la ExpandableListView correctamente.

Entonces también necesitamos este método, para asegurarnos de que al hacer clic en los grupos también se calculará la altura:

 private void setListViewHeight(ExpandableListView listView, int group) { ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter(); int totalHeight = 0; int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY); for (int i = 0; i < listAdapter.getGroupCount(); i++) { View groupItem = listAdapter.getGroupView(i, false, null, listView); groupItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); totalHeight += groupItem.getMeasuredHeight(); if (((listView.isGroupExpanded(i)) && (i != group)) || ((!listView.isGroupExpanded(i)) && (i == group))) { for (int j = 0; j < listAdapter.getChildrenCount(i); j++) { View listItem = listAdapter.getChildView(i, j, false, null, listView); listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); totalHeight += listItem.getMeasuredHeight(); } } } ViewGroup.LayoutParams params = listView.getLayoutParams(); int height = totalHeight + (listView.getDividerHeight() * (listAdapter.getGroupCount() - 1)); if (height < 10) height = 200; params.height = height; listView.setLayoutParams(params); listView.requestLayout(); } 

Eso es más o menos, entonces funciona bien, pero esta solución se puede optimizar aún más.

no puedes usar listview dentro de la vista de desplazamiento, por lo que deberías usar la vista de desplazamiento y añadir las filas como vistas dinámicamente.

No necesitas más de un RelativeLayout, ya que la lista expandible debe estar entre dos elementos (en tu caso), estos dos elementos van a ser los primeros con parentTop y parentBottom, el resto se colocará jugando con arriba / abajo.

 <?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/White" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="15sp" android:text="In this page you can save a group of exercise under one routine." android:textColor="@color/Black" android:textSize="20sp" /> <CheckBox android:id="@+id/checkInstructions" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginTop="16dp" android:checked="false" android:text="dont show again when opening the page" android:textColor="@color/Black" /> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/checkInstructions" android:layout_marginTop="15sp" android:text="If you want to open the instruction again check &apos;need help?&apos;" android:textColor="@color/Black" android:textSize="20sp" /> <ExpandableListView android:id="@+id/instructionsExView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/textView2" android:layout_below="@id/textView1" android:layout_marginTop="15sp" > </ExpandableListView> </RelativeLayout> 

Puede utilizar el código a continuación para lograr esto. Utilicé ListView que puedes reemplazar con ExpandableListView

 <?xml version="1.0" encoding="utf-8"?> 

 <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="15sp" android:text="In this page you can save a group of exercise under one routine." android:textColor="@color/WHITE" android:textSize="20sp" /> <ListView android:id="@+id/listView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2" > </ListView> <TextView android:id="@+id/textView2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="15sp" android:text="If you want to open the instruction again check &apos;need help?&apos;" android:textColor="@color/WHITE" android:textSize="20sp" /> <CheckBox android:id="@+id/checkInstructions" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView2" android:layout_marginBottom="20dp" android:layout_marginTop="16dp" android:checked="false" android:text="dont show again when opening the page" android:textColor="@color/WHITE" /> 

He comprobado el código anterior con alrededor de 50 listitem valor y probado en un dispositivo de pantalla muy pequeño y funciona bien.

 <?xml version="1.0" encoding="utf-8"?> 

 <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="15sp" android:text="In this page you can save a group of exercise under one routine." android:textColor="@color/WHITE" android:textSize="20sp" /> <ExpandableListView android:id="@+id/expandableListView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="2" > </ExpandableListView> <TextView android:id="@+id/textView2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="15sp" android:text="If you want to open the instruction again check &apos;need help?&apos;" android:textColor="@color/WHITE" android:textSize="20sp" /> <CheckBox android:id="@+id/checkInstructions" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView2" android:layout_marginBottom="20dp" android:layout_marginTop="16dp" android:checked="false" android:text="dont show again when opening the page" android:textColor="@color/WHITE" /> 

Comprobé con ExpandableListView y funcionaba bien para mí.

  • Grade Error al analizar XML: el prefijo no debe enlazarse a uno de los nombres de espacio de nombres reservados
  • Android trazo discontinuo potencial ICS potencial error
  • Biblioteca de diseño de Android - Problemas de relleno / margen de botón de acción flotante
  • ¿Por qué mis elementos de ListView no se pueden hacer clic?
  • ¿Cómo hacer un botón que muestra el carácter de retroceso (⌫) en Android?
  • Android Studio: El cursor de texto desaparece / desapareció después de abrir alguna otra clase o pegar texto en diferentes clases
  • ¿Cómo podemos cambiar el icono de la aplicación Android de forma dinámica en Android
  • Las etiquetas HTML no funcionan dentro de strings.xml
  • ¿Por qué este código sigue activando la SaxParseException: "" PI no debe comenzar con xml "?
  • Lista de lecturas <Item> con retrofit de XML API
  • Android nueve patch no se reconoce en el dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.