Tengo un diseño de Android que tiene scrollView
una serie de elementos. En la parte inferior scrollView
, tengo un listView
que luego se completa con un adaptador.
El problema que estoy experimentando es que Android está excluyendo el listView
del scrollView
ya que scrollView
ya tiene una función de desplazamiento. Quiero listView
que sea tan largo como el contenido y que la vista de desplazamiento principal sea desplazable.
¿Cómo puedo lograr este comportamiento?
Aquí está mi diseño principal:
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true"
android:gravity="top" >
<LinearLayout
android:id="@+id/foodItemActvity_linearLayout_fragments"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>
Luego agregar mediante programación mis componentes a la linearlayour con el id: foodItemActvity_linearLayout_fragments
. A continuación se muestra una de las vistas que se carga en esa distribución lineal. Este es el que me está dando problemas con los pergaminos.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/fragment_dds_review_textView_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Reviews:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ListView
android:id="@+id/fragment_dds_review_listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Mi adaptador luego llena esta vista de lista.
Aquí hay una imagen del visor de jerarquía de Android cuando hago clic en el scrollView maestro:
Como puede ver, está excluyendo las revisiones listView.
Debería poder desplazar la página hacia abajo y ver 8 comentarios, pero en cambio solo me muestra esos 3, y puedo desplazarme en la pequeña parte donde están los comentarios. Quiero un desplazamiento de página global
fuente
Respuestas:
La solución más corta y fácil para cualquier ChildView para desplazarse dentro de un ScrollView . Cualquier cosa como ListView, RecyclerView, etc. No tiene que hacer nada especial en el código.
Simplemente reemplace ScrollView con android.support.v4.widget.NestedScrollView en su xml actual y luego ocurre la magia.
A continuación se muestra un código xml de muestra:
Ahora puedes deshacerte de todos los trucos feos que hicimos para evitar este desplazamiento anidado.
Es hora de jugar. Infierno Yeeeeeeeeeeeeeeeeeah!
fuente
requestLayout()
: el método setLayoutParams ya lo hace.view.measure(MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
La respuesta es simple y me sorprende que aún no se haya respondido aquí.
Use a
Header View
o / yFooter View
en la lista misma. No mezcles unScrollView
con unListView
o cualquier cosa que pueda desplazarse. Está destinado a ser utilizado con encabezados y pies de página :)Esencialmente, tome todo el contenido sobre su ListView, póngalo en otro archivo .xml como diseño y luego en código infle y agréguelo a la lista como una vista de encabezado.
es decir
fuente
Sé que ha pasado tanto tiempo, pero también tuve este problema, probé esta solución y está funcionando. Así que supongo que también puede ayudar a los demás.
Agrego android: fillViewport = "true" en el diseño xml para scrollView. Entonces, en general, mi ScrollView será así.
Y funciona como magia para mí. El ListView que se encuentra dentro de mi ScrollView se expande a su tamaño nuevamente.
Aquí está el código de ejemplo completo para ScrollView y ListView.
fuente
Usted crea ListView personalizado que no es desplazable
En su archivo de recursos de diseño
En el archivo Java, cree un objeto de su CustomListview en lugar de ListView como: NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
fuente
puede usar este código para viewview en scrollview
fuente
ListView
interiorRecyclerView
para mostrar más que el primer elemento.Puede resolverlo agregando
android:fillViewport="true"
a su ScrollView.antes de usar esa propiedad, solo había un hijo de mi vista de lista visible. después de usar eso, todas las filas o elementos secundarios de la lista son visibles.
fuente
No hagas nada en Parent ScrollView. Solo haga esto a ListView secundario. Todo funcionará perfectamente.
fuente
Este código resolverá su problema si ha implementado solo un ListView en un código.
Si está utilizando RelativeLayout como ListView child, este código devuelve una NullPointerException aquí listItem.measure (0, 0); , debido a RelativeLayout. Y la solución es poner su Relativelayout dentro de un LinearLayout y funcionará bien.
fuente
Lo dejaré aquí en caso de que alguien enfrente el mismo problema. Tuve que poner un ListView dentro de un ScrollView. ListView con encabezado no era una opción por varias razones. Tampoco era una opción para usar LinearLayout en lugar de ListView. Así que seguí la solución aceptada, pero no funcionó porque los elementos de la lista tenían un diseño complejo con varias filas y cada elemento de la vista de lista era de altura variable. La altura no se midió correctamente. La solución fue medir cada elemento dentro del método getView () del Adaptador ListView.
fuente
¡Puede poner fácilmente ListView en ScrollView! Solo necesita cambiar la altura de ListView mediante programación , así:
¡Esto funciona perfectamente!
fuente
Hecho después de mucha I + D:
fragment_one.xml debería verse así:
Su clase Java de FragmentOne.java se ve así:
onCreateView
fuente
Tuve un problema similar al problema planteado por el póster original: cómo hacer que la vista de lista se desplace dentro de la vista de desplazamiento, y esta respuesta resolvió mi problema. Deshabilite el desplazamiento de un ListView contenido dentro de un ScrollView
No llamé fragmentos nuevos a diseños existentes ni nada de eso, como estaba haciendo el OP, por lo que mi código se vería así:
Básicamente, lo que estoy haciendo es verificar la longitud de la vista de lista antes de llamarla y cuando la llamo lo hago en esa longitud. En su clase de Java, use esta función:
Y llame a la función así:
El resultado es una vista de lista sin barra de desplazamiento, se muestra toda la longitud de la vista de lista, que se desplaza con la barra de desplazamiento de la vista de desplazamiento.
fuente
Como otros ya han mencionado, no use ListView dentro de un ScrollView.
Para solucionarlo, puede usar un LinearLayout, pero para mantener las cosas ordenadas: complete su LinearLayout con un Adaptador, igual que con un ListView
Puede usar esta clase como un reemplazo de LinearLayout que admita adaptadores
fuente
Puede poner todo en diseño lineal. Es decir, cree un diseño lineal y tendrá 2 hijos, vista de desplazamiento y otro diseño lineal. Dales pesos de diseño y aquí tienes:
fuente
Nunca debe usar un ScrollView con un ListView, porque ListView se encarga de su propio desplazamiento vertical. Lo que es más importante, hacer esto anula todas las optimizaciones importantes en ListView para tratar con listas grandes, ya que obliga a ListView a mostrar su lista completa de elementos para llenar el contenedor infinito proporcionado por ScrollView.
http://developer.android.com/reference/android/widget/ScrollView.html
fuente
Mi requisito es incluir un ListView de elementos de igual tamaño dentro de un ScrollView. Probé algunas de las otras soluciones enumeradas aquí, ninguna parecía dimensionar correctamente el ListView (demasiado poco espacio o demasiado). Esto es lo que funcionó para mí:
Espero que esto ayude a alguien.
fuente
¡NUNCA ponga el
ListView
interior de unScrollView
! Puede encontrar más información sobre ese tema en Google . En su caso, use un enLinearLayout
lugar deListView
y agregue los elementos mediante programación.fuente
Actualizar
a
El punto aquí es que está tratando de establecer la altura en 0dp (fijo)
fuente
Encontré una solución para scrollview -> viewpager -> FragmentPagerAdapter -> fragment -> dynamic viewview, pero no soy el autor. hay algunos errores, pero al menos funciona
diseño de fragmentos puede ser cualquier cosa
entonces en algún lugar solo
fuente
Para usar la vista de lista dentro de la vista de desplazamiento, puede seguir estos pasos que me funcionaron:
1) Cree un archivo Java NonScrollListView que deshabilite la propiedad de desplazamiento predeterminada de la vista de lista. y el código está debajo
2) Ahora cree el archivo xml que tiene
NestedScrollView
y dentro de este usoNonScrollListView
para enumerar sus artículos. Esto hará que toda su pantalla se desplace con todas las vistas.3) Ahora en java class, es decir, home.java define en
NonScrollListView
lugar deListview
.el hogar de clase pública extiende el fragmento {int pos = 0; ViewFlipper v_flipper;
Nota: utilicé
Fragments
aquí.fuente
Ok, aquí está mi respuesta. El método que corrige la altura de ListView está lo suficientemente cerrado, pero no es perfecto. En caso de que la mayoría de los artículos tengan la misma altura, eso funciona bien. Pero en caso de que no sea así, entonces hay un gran problema. Lo intenté muchas veces, y cuando coloqué el valor de listItem.getMeasureHeight y listItem.getMeasuerWidth en el registro, vi que los valores de ancho varían mucho, lo que no se espera aquí, ya que todos los elementos en el mismo ListView deberían tener el mismo ancho Y ahí va el error:
Algunos utilizaron la medida (0, 0), que en realidad hizo que la vista fuera independiente, en ambas direcciones, y el ancho se volviera loco. Algunos intentaron obtener el ancho de listView, pero luego devolvió 0, sin sentido.
Cuando leo más sobre cómo Android renderiza la Vista, me doy cuenta de que todo este intento no puede alcanzar la respuesta que busqué, a menos que estas funciones se ejecuten después de que se visualice la vista.
Esta vez uso el getViewTreeObserver en el ListView que quiero arreglar la altura, luego agregoOnGlobalLayoutListener. Dentro de este método, declaro un nuevo OnGlobalLayoutListener, en el que, esta vez, getWidth devuelve el ancho real de ListView.
El valor pad, es el relleno que configuré en el diseño ListView.
fuente
Si por alguna razón no desea usar
addHeaderView
yaddFooterView
, por ejemplo, cuando tiene varias listas, una buena idea sería reutilizarListAdapter
para llenar un simpleLinearLayout
para que no haya funcionalidad de desplazamiento.Si ya tiene un fragmento completo derivado
ListFragment
y desea convertirlo en un fragmento similar con simpleLinearLayout
sin desplazamiento en su lugar (por ejemplo, para ponerlo en ScrollView), puede implementar un fragmento de adaptador como este:También es posible que desee reenviar
onCreate
,onPause
,onResume
, etc, para el fragmento original en función de sus necesidades o tratar la herencia en lugar de la composición (pero anular ciertos métodos de modo fragmento original no está realmente unido a jerarquía de disposición); pero quería aislar el fragmento original tanto como sea posible, porque solo necesitamos extraerloListAdapter
. Si llamas al fragmento originalsetListAdapter
enonAttach
, eso es probablemente suficiente.Aquí se explica cómo usar
ListAsArrayFragment
para incluirOriginalListFragment
sin desplazarse. En la actividad de los padresonCreate
:fuente
Encontré una solución para scrollview -> viewpager -> FragmentPagerAdapter -> fragment -> dynamic viewview, pero no soy el autor.
diseño de fragmentos puede ser cualquier cosa
entonces en algún lugar solo
fuente
usando este ListView funcionó para mí
y en xml
y en MainActivity
Consulte este artículo para obtener más información y también para saber cómo mantener la vista de cuadrícula dentro de la vista de desplazamiento
fuente
En xml:
En Java:
fuente
Simplemente configure el valor de la altura requerida en un atributo de altura de vista de lista dentro de una vista de desplazamiento principal. Se desplazará junto con el elemento secundario de otros padres.
fuente
Esto funcionó para mí ( link1 , link2 ):
Usted crea ListView personalizado que no es desplazable
En su archivo de diseño
Cree un objeto de su CustomListview en lugar de ListView como:
fuente
Simplemente llame a esta función después de asignar el adaptador a la vista de lista
fuente
fuente
mejor código
fuente