Estoy teniendo problemas con un desplazamiento ListView
dentro de a ScrollView
. Tengo una actividad que tiene algunos EditTexts en la parte superior y luego un host de pestañas con dos pestañas que tienen una ListView cada una. Cuando las vistas EditText están enfocadas, aparece el teclado virtual y, como tengo un ScrollView, el contenido se puede desplazar. Pero el problema surge cuando hay más elementos en ListViews (unos en pestañas), no puedo desplazar ListView, incluso si hay más elementos.
El siguiente es el diseño XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?backgroundImage"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentBottom="true"
android:layout_margin="10dip"
android:id="@+id/buttons">
<Button
android:text="Save"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnSaveorUpdate"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
<Button
android:text="Cancel"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnCancelorDelete"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
</LinearLayout>
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:layout_margin="10dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dip">
<TextView
android:text="Bill details"
android:textColor="?textColorDark"
android:layout_alignParentTop="true"
android:id="@+id/txtEnterDetails"
android:textSize="25dip"
android:textStyle="bold"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_marginBottom="2dip"></TextView>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0dip"
android:layout_height="0dip" />
<EditText
android:layout_width="fill_parent"
android:hint="Enter data"
android:inputType="numberDecimal"
android:id="@+id/txtSample"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtDescription"
android:hint="Enter description"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:inputType="text"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtComment"
android:hint="Enter comment (if any)"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:inputType="text"
android:text=""></EditText>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txtDate"
android:layout_width="wrap_content"
android:text=""
android:textSize="20dip"
android:textColor="?textColorDark"
android:layout_marginLeft="10dip"
android:layout_height="@dimen/editTextHeight"
android:layout_gravity="center_vertical" />
<Button
android:id="@+id/btnPickDate"
android:layout_width="wrap_content"
android:layout_height="@dimen/editTextHeight"
android:text="Select date"
android:layout_margin="2dip"
android:textSize="15dip"
android:layout_gravity="center_vertical" />
</LinearLayout>
<TabHost
android:id="@+id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TabWidget
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@android:id/tabs"></TabWidget>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/tabcontent">
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:id="@+id/tab1">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/tableRow1"
android:layout_marginLeft="2dip"
android:layout_marginRight="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@drawable/ic_menu_invite"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_gravity="center_vertical"></ImageView>
<TextView
android:text="Add friend"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:textColor="?textColorDark"
android:textSize="@dimen/editText"
android:layout_gravity="center_vertical" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
<TextView
android:id="@+id/txtData1"
android:layout_width="170dip"
android:layout_height="wrap_content"
android:text="Data"
android:textSize="14dip"
android:textStyle="bold"
android:textColor="#000000">
</TextView>
<TextView
android:id="@+id/txtData2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sample"
android:textSize="13dip"
android:textColor="#000000"></TextView>
</TableRow>
</TableLayout>
<ListView
android:cacheColorHint="#00000000"
android:id="@+id/ListView01"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:id="@+id/tab2"
android:orientation="vertical">
<TableLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TableRow
android:id="@+id/tableRow2"
android:layout_marginLeft="2dip"
android:layout_marginRight="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:src="@drawable/ic_menu_invite"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_gravity="center_vertical"></ImageView>
<TextView
android:text="Sample"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_centerVertical="true"
android:textColor="?textColorDark"
android:textSize="@dimen/editText"
android:layout_gravity="center_vertical" />
</LinearLayout>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip">
<TextView
android:id="@+id/txtUser1"
android:layout_width="170dip"
android:layout_height="wrap_content"
android:text="User"
android:textSize="14dip"
android:textStyle="bold"
android:textColor="#000000">
</TextView>
<TextView
android:id="@+id/txtUserData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UserData"
android:textSize="13dip"
android:textColor="#000000"></TextView>
</TableRow>
</TableLayout>
<ListView
android:cacheColorHint="#00000000"
android:id="@+id/ListView02"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
</LinearLayout>
</ScrollView>
</RelativeLayout>
Por favor, ¿alguien puede decirme cuál es el problema aquí? Tengo otra publicación en ListView dentro del problema ScrollView, pero no fueron de utilidad en mi caso.
android
listview
android-layout
scrollview
Ashwani K
fuente
fuente
Respuestas:
No debe poner un a
ListView
dentroScrollView
porque laListView
clase implementa su propio desplazamiento y simplemente no recibe gestos porque todos los maneja el padreScrollView
. Le recomiendo que simplifique su diseño de alguna manera. Por ejemplo, puede agregar vistas a las que desea desplazarseListView
como encabezados o pies de página.ACTUALIZACIÓN :
A partir de API Level 21 (Lollipop), los contenedores de desplazamiento anidados son compatibles oficialmente con Android SDK. Hay un montón de métodos
View
yViewGroup
clases que proporcionan esta funcionalidad. Para que el desplazamiento anidado funcione en el Lollipop, debe habilitarlo para una vista de desplazamiento secundario agregandoandroid:nestedScrollingEnabled="true"
a su declaración XML o llamando explícitamentesetNestedScrollingEnabled(true)
.Si desea que el desplazamiento anidado funcione en dispositivos anteriores a Lollipop, lo que probablemente haga, debe usar las clases de utilidad correspondientes de la biblioteca de Soporte. Primero debe reemplazarlo
ScrollView
con NestedScrollView . Este último implementa NestedScrollingParent y NestedScrollingChild para que pueda usarse como contenedor de desplazamiento primario o secundario.Pero
ListView
no admite el desplazamiento anidado, por lo tanto, debe subclasificarlo e implementarloNestedScrollingChild
. Afortunadamente, la biblioteca de soporte proporciona la clase NestedScrollingChildHelper , por lo que solo debe crear una instancia de esta clase y llamar a sus métodos desde los métodos correspondientes de su clase de vista.fuente
ListView
sería extraño. Pero su diseño es muy muy complicado. Ni siquiera puedo entender cómo quieres que se vea. De todos modos, será mejor que sea más simple porque unListView
anidado en unoScrollView
que está anidado en otroScrollView
parece extraño y no funcionará.Encontré una solución que funciona excelentemente y puede desplazarse
ListView
sin problemas:Lo que esto hace es deshabilitar los
TouchEvent
s en elScrollView
y hacer que losListView
intercepten. Es simple y funciona todo el tiempo.fuente
También tengo una solución. Yo siempre uso este método. Prueba esto
Clase NestedListView.java:
fuente
LinearLayout
lugar de aListView
. Esto significa que si tiene una gran cantidad de elementos de lista (o elementos de lista complejos) a continuación, los dispositivos Android se toma mucho tiempo para abrir la actividad (o incluso caída al intentar en mi caso).Solo tienes que reemplazar tu
<ScrollView ></ScrollView>
con estoCustom ScrollView
como<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
fuente
Tuve el mismo problema y mientras buscaba en Google encontré su pregunta. Sí, la respuesta marcada también funcionó para mí, pero hubo algún problema.
De todos modos encontré otra solución . que funciona perfectamente sin hacer malabarismos.
fuente
fuente
Aquí está el método exacto de usar Listview en Scrollview. Todo lo que tenemos para manejar eventos táctiles.
fuente
¡Usa el siguiente método y disfruta!
listViewTouchAction es un valor entero global. Si puedes reemplazar la línea
con algo más, compártelo con nosotros.
¡Disfrutar!
fuente
Es una mala práctica tener dos vistas de desplazamiento diferentes juntas. ListView en sí tiene su propia funcionalidad de desplazamiento y la altura se ajusta automáticamente según la configuración del Adaptador para sus elementos de fila (Keelping en mente, no estamos configurando una altura específica para ListView en nuestro diseño xml). Sin embargo, en su caso, puede reemplazar ListView con una clase y esto ajustará la altura de su ListView teniendo en cuenta que su ListView está dentro de ScrollView.
Esto te ayudara:
Ahora extienda su ListView con esta clase, simplemente cambie su etiqueta ListView de su recurso xml a sofocante como este,
Esto resolverá su problema de desplazamiento de ListView, ya que ahora el desplazamiento principal es administrado por ScrollView en lugar de ListView.
fuente
Sé que esta pregunta se hizo hace mucho tiempo, pero quien esté atrapado por ahora puede resolver esto agregando esta línea en su ListView
Por ejemplo -
fuente
Tengo un problema similar y lo resolví creando una clase personalizada extendiéndola con ListView.
ScrollableListView.java
Uso:
fuente
Demo_ListView_In_ScrollView
==============================
========================
listview_adapter
==========================
===================================
Clase auxiliar
====================================
========================
demo_listview_in_scrollview_activity.xml
========================
================
item_list_xml.xml
==================
fuente
La mejor solución es utilizar NestedScrollVew con RecyclerView o, si desea utilizar Listview, puede agregarle una vista de encabezado y pie de página. Por ejemplo:
fuente
He probado y probado casi todos los métodos mencionados anteriormente, créanme, después de escapar completamente de RecyclerView, reemplacé mi ListView con RecyclerView y funcionó perfectamente. No necesitaba ninguna biblioteca de terceros para ExtendedHeightListView y todo, solo RecyclerView simple y llanamente.
Así que aquí está mi archivo de diseño antes de recyclerView:
ESTO ES DESPUÉS DE REEMPLAZAR MI VISTA DE LISTA CON UNA DE LAS MUCHAS SOLUCIONES MENCIONADAS ARRIBA. Entonces, el problema era que la vista de lista no se estaba comportando correctamente debido a 2 errores de vista de desplazamiento (tal vez no un error) en Android.
Reemplacé la vista con reciclador para formar mi diseño final.
Este es mi adaptador de vista de reciclador:
Y este es mi diseño personalizado RecyclerView:
Y VOILA, obtuve el efecto deseado de ListView (Now RecyclerView) dentro de una vista de desplazamiento. Aquí está la imagen final de la interfaz de usuario
En una nota final, creo que reemplazar el RecyclerView fue una mejor opción para mí, ya que mejoró la estabilidad general de la aplicación y también me ayudó a comprender mejor el RecyclerView. Si tuviera que sugerir una solución, voy a decir reemplazar su ListView con un RecyclerView.
fuente
La solución anterior dada por @Shailesh Rohit funciona perfectamente bien. Hay que hacer algunos trucos.
Si coloca la clase auxiliar dentro de la misma clase (clase principal), haga que la clase auxiliar sea estática y getListViewSize () no sea estática.
Lo más importante, escriba "Helper.getListViewSize (listView);" declaración después de configurar el adaptador por primera vez como "listView.setAdapter (myAdapter);" así como cuando esté usando "myAdapter.notifyDataSetChanged ();"
El uso se muestra a continuación.
listView = (ListView) findViewById (R.id.listView); myAdapter = new ArrayAdapter (this, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);
myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);
fuente
Según Según mí, mientras usa setOnTouchListener om parent o child, detenga el desplazamiento del padre al tocar al niño; de lo contrario, deje de desplazarse al tocar al padre.
fuente
Intente esto con ScrollView, no con ListView.
fuente
requestDisallowInterceptTouchEvent (boolean disallowIntercept)
Prueba esta respuesta,
fuente
reemplace ListView por RecycleView dentro de ScrollView. funciona sin problemas sin código fuente adicional:
fuente
Para ListView dentro de ScrollView use NestedScrollView, puede manejar esta funcionalidad muy fácilmente:
fuente
He tenido este error y mi solución es la siguiente:
1. Cree una vista de lista personalizada que no sea desplazable
}
2. Utilice la clase personalizada anterior para el archivo xml
Espero lo mejor para ti.
fuente
Encontré una solución para eso, en lugar de usar scrollview, puedes usar addHeaderview y addFooterview de listview
Aquí está mi fragmento
Ahora, con la vista de lista, su diseño también se puede desplazar. ¡¡¡Disfrútala!!!
fuente
Reemplace ScrollView por android.support.v4.widget.NestedScrollView dentro de xml. corre
1) Uso en XML ::::
android.support.v4.widget.NestedScrollView
en vez de::::
ScrollView
2) Y use la vista de lista de esta manera usando NonScrollListView en el archivo cs:
3) Finalmente use este código para identificar scrollview en el archivo cs:
fuente
Mejor código
fuente
Añadir:
android:nestedScrollingEnabled="true"
fuente
Utilice este método y su vista de lista se puede desplazar dentro de la vista de desplazamiento: -
fuente
No puede agregar un ListView en una vista de desplazamiento, ya que la vista de lista también se desplaza y habría un problema de sincronización entre el desplazamiento de vista de lista y el desplazamiento de vista de desplazamiento. Puede crear una Vista de lista personalizada y agregar este método.
fuente
No le des vista de desplazamiento
ListView
, porque tiene esa configuración predeterminadafuente