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

  • Android estilo Recopilación de recursos (aapt) fallando: Tabla de recursos no válidos: tamaño de encabezado 0xc
  • Cambiar entre previsualización de referencia y valor de recursos de cadena en el editor xml
  • ¿Cómo puedo reducir el relleno interno alrededor del texto dentro de un objeto de botón de Android?
  • Android: ¿Cómo inyectar un elemento <string> en otro elemento <string> en XML?
  • Agregar efectos de sombra de gota al campo EditarTexto
  • Java.lang.UnsupportedOperationException: No se puede convertir a color: type = 0x1
  • fragment_display_message: Mi primer error en la aplicación para Android
  • Cómo comprobar NULL en etiquetas XML XML analizadas
  • Colocación de imágenes en android con ImageView en XML
  • java.lang.NullPointer Excepción en getResources (). getString (R.string.value);
  • Exportación de una base de datos SQLite a un archivo XML en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.