ListView no desplazable dentro de ScrollView

Estoy tratando de hacer un diseño como este:

diseño

El problema es que no quiero que los ListViews sean desplazables. Quiero que sean tan altos como lo necesitan y hacer que toda la pantalla sea desplazable. Si establezco la altura de ListView en wrap_content , eso no funciona. La única manera de hacerlo funcionar es establecer una altura específica – pero no sé cuántos elementos estarán en el ListView.

Sé que no debería poner ListView dentro de ScrollView – pero no quiero que el ListView sea desplazable, sólo para mostrar todos los elementos.

Tal vez hay una mejor manera de hacerlo funcionar?

Crea ListView personalizado que no es desplazable

 public class NonScrollListView extends ListView { public NonScrollListView(Context context) { super(context); } public NonScrollListView(Context context, AttributeSet attrs) { super(context, attrs); } public NonScrollListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); } } 

En el archivo de recursos de diseño

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fadingEdgeLength="0dp" android:fillViewport="true" android:overScrollMode="never" android:scrollbars="none" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <!-- com.Example Changed with your Package name --> <com.Example.NonScrollListView android:id="@+id/lv_nonscroll_list" android:layout_width="match_parent" android:layout_height="wrap_content" > </com.Example.NonScrollListView> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/lv_nonscroll_list" > <!-- Your another layout in scroll view --> </RelativeLayout> </RelativeLayout> </ScrollView> 

En archivo Java

Cree un objeto de su vista personalizada en lugar de ListView como:
NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);

No hay necesidad de usar un listview en absoluto.

Si realmente piensas en ello, un listview puede ser reemplazado por un linearlayout en tu caso. El adaptador sería el mismo, sin embargo, en lugar de adjuntar el adaptador con su listview, simplemente llame a la función getView del adaptador en un bucle for de sus datos y agregue las vistas recuperadas a su linear lineal.

Sin embargo, este enfoque sólo se recomienda si tiene un pequeño número de elementos en su lista y la representación de la pantalla de los elementos no es de memoria intensiva.

Bueno, hay un tipo Android cool llamado Mark Murphy aka CommonsWare y construyó un componente muy útil llamado CWAC Merge Adapter que le permite hacer lo que necesita. Deberá agregar las vistas dinámicamente y no desde XML; Pero teniendo en cuenta su interfaz de usuario simple, que no debería ser un problema. Lo estoy usando para este tipo de casos cuando no tengo ni idea de qué tipo de datos debo desplazar.

Si no desea usarlo (por razones de licenciamiento quizás), puede tener una lista única allí (en lugar de esas 2 vistas consecutivas de lista) y sobreescribir getItemViewsCount , getItemViewType y getView para dar el diseño anterior. Si busca android listview different rows en Google, encontrará información útil. Por ejemplo este enlace , o este .

Sin embargo, yo iría para merge-adaptador.

Tengo una solución fácil si es posible calcular su altura / ancho del artículo … Usted apenas tiene que crear un parent Linearlayout de ListView y fijar entonces la altura del padre de Java.

Introduzca aquí la descripción de la imagen

Supongamos que necesitas diseñar esta vista … Ahora el tamaño de la página principal está definiendo desde java …

 final LinearLayout parent=(LinearLayout)findViewById(R.id.parent); final ListView listview=(ListView)findViewById(R.id.listview); parent.setLayoutParams(new LinearLayout.LayoutParams(parent.getLayoutParams().width, dpToPx( number_of_item_in_list * per_item_size_in_dp ))); //number_of_item_in_list is list side ~ listArray.size(); //per_item_size_in_dp = calculate item size in dp. Ex: 80dp public static int dpToPx(int dp) { return (int) (dp * Resources.getSystem().getDisplayMetrics().density); } 

eso es todo 🙂

La mejor manera de hacerlo (en 2017) es usar un RecyclerView con un NestedScrollView. Ningún hacks requerido y funciona fuera de la caja como usted lo quiere a.

  • Cómo desplazarse tableview en android
  • ¿Cómo desplazarse al centro de HorizontalScrollView sólo cuando se inicia la actividad?
  • Cómo agregar scrollview a keyboardView en android
  • Cómo comprobar si una vista es visible en un área específica o no dentro de ScrollView
  • ¿Es posible tener un ViewPager dentro de un ScrollView?
  • Cómo reproducir video de video-view que actualmente se enfoca en la vista de reciclador
  • ¿El oyente Scrollview no está trabajando en Xamarin para Android?
  • ¿Dibuja gráficas en android utilizando Graphview?
  • Múltiples WebViews en ScrollView dando problemas (Android)
  • ¿Cambiar la pestaña de desplazamiento / desplazamiento en combinación con ScrollView?
  • Android: cómo hacer scrollview infinito con desplazamiento sin fin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.