J'ai des problèmes avec un défilement ListView
dans un fichier ScrollView
. J'ai une activité qui a quelques EditTexts dans la partie supérieure, puis un hôte d'onglet avec deux onglets qui ont chacun un ListView. Lorsque les vues EditText sont focalisées, le clavier virtuel s'affiche et comme j'ai un ScrollView, le contenu peut faire défiler. Mais le problème survient lorsqu'il y a plus d'éléments dans ListViews (ceux dans les onglets), je ne suis pas en mesure de faire défiler le ListView, même s'il y a plus d'éléments.
Voici le format 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>
Quelqu'un peut-il me dire quel est le problème ici? J'ai un autre message sur le problème ListView à l'intérieur de ScrollView, mais ils n'étaient d'aucune utilité dans mon cas.
android
listview
android-layout
scrollview
Ashwani K
la source
la source
Réponses:
Vous ne devriez pas mettre un à l'
ListView
intérieur de aScrollView
car laListView
classe implémente son propre défilement et elle ne reçoit tout simplement pas de gestes car ils sont tous gérés par le parentScrollView
. Je vous recommande fortement de simplifier en quelque sorte votre mise en page. Par exemple, vous pouvez ajouter des vues que vous souhaitez faire défiler vers lesListView
en-têtes ou pieds de page.MISE À JOUR :
À partir du niveau d'API 21 (Lollipop), les conteneurs de défilement imbriqués sont officiellement pris en charge par Android SDK. Il existe un tas de méthodes
View
et deViewGroup
classes qui fournissent cette fonctionnalité. Pour que le défilement imbriqué fonctionne sur la Lollipop, vous devez l'activer pour une vue de défilement enfant en l'ajoutantandroid:nestedScrollingEnabled="true"
à sa déclaration XML ou en appelant explicitementsetNestedScrollingEnabled(true)
.Si vous souhaitez que le défilement imbriqué fonctionne sur des périphériques pré-Lollipop, ce que vous faites probablement, vous devez utiliser les classes d'utilitaires correspondantes de la bibliothèque de support. Vous devez d'abord vous remplacer
ScrollView
par NestedScrollView . Ce dernier implémente à la fois NestedScrollingParent et NestedScrollingChild afin qu'il puisse être utilisé comme conteneur de défilement parent ou enfant.Mais
ListView
ne prend pas en charge le défilement imbriqué, vous devez donc le sous-classer et l'implémenterNestedScrollingChild
. Heureusement, la bibliothèque Support fournit la classe NestedScrollingChildHelper , il vous suffit donc de créer une instance de cette classe et d'appeler ses méthodes à partir des méthodes correspondantes de votre classe de vue.la source
ListView
serait étrange. Mais votre mise en page est très très compliquée. Je ne comprends même pas à quoi vous voulez que ça ressemble. Quoi qu'il en soit, vous feriez mieux de simplifier les choses car unListView
imbriqué dans unScrollView
qui est imbriqué dans un autreScrollView
semble étrange et ne fonctionnera pas.J'ai trouvé une solution qui fonctionne parfaitement et peut faire défiler le
ListView
sans problèmes:Cela permet de désactiver les
TouchEvent
s sur leScrollView
et de lesListView
intercepter. C'est simple et ça marche tout le temps.la source
J'ai aussi une solution. J'utilise toujours cette méthode. Essaye ça
Classe NestedListView.java:
la source
LinearLayout
plutôt que comme unListView
. Cela signifie que si vous avez un grand nombre d'éléments de liste (ou d'éléments de liste complexes) alors les appareils Android prendront beaucoup de temps pour ouvrir l'activité (ou même planter en essayant dans mon cas).Vous devez simplement remplacer votre
<ScrollView ></ScrollView>
par ceciCustom ScrollView
comme<com.tmd.utils.VerticalScrollview > </com.tmd.utils.VerticalScrollview >
la source
J'ai eu le même problème et en cherchant sur Google, j'ai trouvé votre question. Oui, la réponse marquée a fonctionné pour moi aussi, mais il y avait un problème.
Quoi qu'il en soit, j'ai trouvé une autre solution . qui fonctionne parfaitement sans faire de jonglerie.
la source
la source
Voici la méthode exacte d'utilisation de Listview avec dans le Scrollview. Tout ce que nous avons pour gérer les événements tactiles.
la source
Utilisez la méthode suivante et profitez-en!
listViewTouchAction est une valeur entière globale. Si vous pouvez remplacer la ligne
avec autre chose, partagez-le avec nous.
Prendre plaisir!
la source
C'est une mauvaise pratique d'avoir deux vues de défilement différentes ensemble. ListView lui-même a sa propre fonctionnalité de défilement et la hauteur est ajustée automatiquement en fonction des paramètres de l'adaptateur pour vos éléments de ligne (Keelping à l'esprit, nous ne définissons pas une hauteur spécifique à ListView dans notre mise en page xml). Cependant, dans votre cas, vous pouvez remplacer ListView par une classe et cela ajustera la hauteur de votre ListView en gardant à l'esprit que votre ListView est à l'intérieur de ScrollView.
Cela vous aidera à:
Maintenant, étendez votre ListView avec cette classe, changez simplement votre balise ListView de votre ressource xml en lissant comme ça
Cela résoudra votre problème de défilement de ListView, car maintenant le défilement parent est géré par ScrollView plutôt que ListView.
la source
Je sais que cette question a été posée il y a longtemps, mais qui est bloqué pour l'instant peut résoudre ce problème en ajoutant cette ligne dans votre ListView
Par exemple -
la source
J'ai un problème similaire et résolu en créant une classe personnalisée en étendant avec ListView.
ScrollableListView.java
Usage:
la source
Demo_ListView_In_ScrollView
===============================
=========================
listview_adapter
===========================
====================================
Classe d'assistance
=====================================
=========================
demo_listview_in_scrollview_activity.xml
=========================
================
item_list_xml.xml
===================
la source
La meilleure solution est d'utiliser NestedScrollVew avec RecyclerView ou si vous souhaitez utiliser Listview, vous pouvez ajouter une vue d'en-tête et de pied de page à cela. Par exemple:
la source
J'ai essayé et testé presque toutes les méthodes mentionnées ci-dessus, croyez-moi, après avoir complètement fui RecyclerView, j'ai remplacé mon ListView par RecyclerView et cela a parfaitement fonctionné. N'a pas besoin d'une bibliothèque tierce pour ExtendedHeightListView et tout, tout simplement RecyclerView.
Voici donc mon fichier de mise en page avant recyclerView:
CECI EST APRÈS LE REMPLACEMENT DE MA LISTVIEW AVEC UNE DES NOMBREUSES SOLUTIONS MENTIONNÉES CI-DESSUS. Le problème était donc que la liste ne se comportait pas correctement en raison de 2 bogues de scrollview (peut-être pas un bogue) dans Android.
J'ai remplacé la vue par recycleur pour former ma mise en page finale.
Ceci est mon adaptateur de vue recycleur:
Et voici ma disposition personnalisée RecyclerView:
Et VOILA, j'ai obtenu l'effet souhaité de ListView (maintenant RecyclerView) dans un scollview. Voici l'image finale de l'interface utilisateur
Sur une note finale, je pense que le remplacement de RecyclerView était un meilleur choix pour moi, car il a amélioré la stabilité globale de l'application et m'a également aidé à mieux comprendre RecyclerView. Si je devais suggérer une solution, je vais dire de remplacer votre ListView par un RecyclerView.
la source
La solution ci-dessus donnée par @Shailesh Rohit fonctionne parfaitement. Certaines astuces doivent être faites.
Si vous placez la classe d'assistance dans la même classe (classe principale), faites en sorte que la classe Helper soit statique et getListViewSize () ne soit pas statique.
Le plus important, écrivez "Helper.getListViewSize (listView);" instruction après avoir défini l'adaptateur pour la première fois comme "listView.setAdapter (myAdapter);" ainsi que lorsque vous utilisez "myAdapter.notifyDataSetChanged ();"
L'utilisation est indiquée ci-dessous.
listView = (ListView) findViewById (R.id.listView); myAdapter = new ArrayAdapter (ceci, android.R.layout.simple_list_item_1, listValues); listView .setAdapter (myAdapter); Helper.getListViewSizelistView (listView);
myAdapter.notifyDataSetChanged (); Helper.getListViewSizelistView (listView);
la source
Comme Selon moi, pendant que vous utilisez setOnTouchListener om parent ou enfant arrêtez le défilement du parent lorsque vous touchez l'enfant sinon arrêtez le défilement de l'enfant lorsque vous touchez le parent
la source
Essayez ceci avec ScrollView, pas avec ListView.
la source
requestDisallowInterceptTouchEvent (booléen disallowIntercept)
Essayez cette réponse,
la source
remplacez ListView par RecycleView dans ScrollView. il fonctionne correctement sans code source supplémentaire:
la source
Pour ListView à l'intérieur de ScrollView, utilisez NestedScrollView, il peut gérer cette fonctionnalité très facilement:
la source
J'ai eu cette erreur et ma solution est la suivante:
1. Créez une liste personnalisée qui ne peut pas faire défiler
}
2. Utilisez la classe personnalisée ci-dessus pour le fichier xml
J'espère le meilleur pour vous.
la source
J'ai trouvé une solution pour ça, lieu d'utiliser scrollview, vous pouvez utiliser addHeaderview et addFooterview de listview
Voici mon extrait,
Maintenant, avec la liste, votre mise en page peut également être défilée. Profitez-en!!!
la source
Remplacez ScrollView par android.support.v4.widget.NestedScrollView à l'intérieur de xml. il court
1) Utilisation en XML ::::
android.support.v4.widget.NestedScrollView
au lieu de::::
ScrollView
2) Et utilisez pour la vue liste de cette manière en utilisant NonScrollListView dans le fichier cs:
3) Enfin, utilisez ce code pour identifier scrollview dans le fichier cs:
la source
Meilleur code
la source
Ajouter:
android:nestedScrollingEnabled="true"
la source
Utilisez cette méthode et votre listview devient scrollable à l'intérieur de scrollview: -
la source
Vous ne pouvez pas ajouter un ListView dans une vue de défilement, car la vue de liste défile également et il y aurait un problème de synchronisation entre le défilement de la vue de liste et le défilement de la vue de défilement. Vous pouvez créer une vue CustomList et y ajouter cette méthode.
la source
Ne donnez pas de vue de défilement à
ListView
, car il a ce paramètre par défautla source