ListView no desplazable dentro de ScrollView
Estoy tratando de hacer un diseño como este:
- Cómo crear multiline edittext con vista de desplazamiento dentro de la actividad?
- Efecto de desplazamiento con múltiples visualizadores
- Android ScrollView no funciona correctamente
- ListView dentro de un ScrollView
- Desplácese hacia arriba ScrollView lentamente
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?
- Android: EditText no rellenar ScrollView y RelativeLayout
- Ejecutar comandos de shell y obtener resultados en un TextView
- ImageView: recicla automáticamente el mapa de bits si ImageView no está visible (dentro de ScrollView)
- Android, LinearLayout no se desplaza
- ¿Cómo configurar las imágenes para ScrollView en lugar de degradar los bordes?
- Desplazar una vista / disposición oculta desde abajo
- ScrollView ignora el layout_height del niño
- Teclado cubre la pantalla en lugar de empujar hasta el diseño?
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.
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.
- Android: onDestroy () o un método similar en la clase Application
- Background-size: cubierta que no funciona en el retrato en la tableta Android