ListView no desplazable dentro de ScrollView

Estoy tratando de hacer un diseño como este:

diseño

El problema es que no quiero que ListViews se pueda desplazar. Quiero que sean tan altos como lo necesiten y que toda la pantalla sea desplazable. Si configuro la altura de ListView para wrap_content , eso no funciona. La única forma de hacerlo funcionar es establecer una altura específica, pero no sé cuántos elementos habrá en ListView.

Sé que no debería poner ListView dentro de ScrollView , pero no quiero que ListView sea desplazable, solo para mostrar todos los elementos.

Tal vez hay una mejor manera de hacerlo funcionar?

Crea un 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 su archivo de recursos de diseño

            

En archivo Java

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

No hay necesidad de usar una vista de lista en absoluto.

Si realmente lo piensas, una vista de lista puede reemplazarse con una distribución lineal en tu caso. El Adaptador sería el mismo, sin embargo, en lugar de conectar el adaptador con su vista de lista, simplemente llame a la función getView del adaptador en un bucle for para sus datos y agregue las vistas recuperadas a su linearlayout vertical.

Sin embargo, este enfoque solo se recomienda si tiene una pequeña cantidad de elementos en su lista y su representación en pantalla de esos elementos no consume mucha memoria.

La mejor manera de hacerlo (en 2017) es usar un RecyclerView con un NestedScrollView. No se requieren hacks y funciona de la forma que usted lo desea.

Bueno, hay un tipo genial de Android llamado Mark Murphy, también conocido como CommonsWare, y él creó un componente muy útil llamado CWAC Merge Adapter que le permite hacer lo que necesita. Tendrá que agregar las vistas dinámicamente y no desde XML; pero teniendo en cuenta su UI simple, eso no debería ser un problema. Lo estoy usando para este tipo de casos cuando no tengo idea de qué tipo de datos se supone que debo desplazar.

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

Sin embargo, iría por merge-adapter.

Tengo una solución fácil si es posible calcular la altura / ancho de su artículo … Solo necesita crear un Linearlayout principal de ListView y luego fijar el Altura parental desde Java.

enter image description here

Supongamos que necesita diseñar esta vista … Ahora el tamaño de diseño principal se define 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 🙂

Elija el ListView que desea que sea desplazable, y luego agregue el método ‘setOnTouchListener’ para que el sistema inserte automáticamente el desplazamiento dentro de ListView

 final ListView listview = (ListView) findViewById(R.id.list); listview.setOnTouchListener(new ListView.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. v.getParent().requestDisallowInterceptTouchEvent(false); break; } // Handle ListView touch events. v.onTouchEvent(event); return true; } }); listview.setClickable(true); 

Espero que eso funcione para usted