J'ai une mise en page Android qui contient scrollView
un certain nombre d'éléments. Au bas de la, scrollView
j'en ai un listView
qui est ensuite rempli par un adaptateur.
Le problème que je rencontre, c'est que Android exclut le listView
du scrollView
car le scrollView
possède déjà une fonction de défilement. Je souhaite listView
que la durée soit aussi longue que le contenu et que la vue de défilement principale puisse défiler.
Comment puis-je obtenir ce comportement?
Voici ma disposition principale:
<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>
Je puis ajouter mes composants programme à l'linearlayour avec l'id: foodItemActvity_linearLayout_fragments
. Vous trouverez ci-dessous l'une des vues chargées dans cette présentation linéaire. C'est celui qui me pose des problèmes avec les parchemins.
<?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>
Mon adaptateur remplit ensuite cette vue de liste.
Voici une image de la visionneuse de la hiérarchie Android lorsque je clique sur le scrollView principal:
Comme vous pouvez le voir, il exclut la liste des avis.
Je devrais pouvoir faire défiler la page vers le bas et voir 8 avis, mais à la place, cela ne me montre que ces 3, et je peux faire défiler la petite partie où se trouvent les avis. Je veux un défilement de page global
la source
Réponses:
La solution la plus courte et la plus simple pour tout ChildView pour faire défiler un ScrollView . N'importe quoi comme ListView, RecyclerView, etc. Vous n'avez rien à faire de spécial dans le code.
Remplacez simplement ScrollView par android.support.v4.widget.NestedScrollView dans votre xml actuel et la magie opère.
Voici un exemple de code xml:
Vous pouvez maintenant vous débarrasser de tous les vilains hacks que nous avons faits pour contourner ce défilement imbriqué.
C'est l'heure de jouer. Enfer Yeeeeeeeeeeeeeeeeeah!
la source
requestLayout()
- la méthode setLayoutParams le fait déjà.view.measure(MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.AT_MOST),MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
La réponse est simple et je suis surpris qu'elle n'ait pas encore trouvé de réponse ici.
Utilisez un
Header View
ou / etFooter View
sur la liste elle-même. Ne mélangez pas unScrollView
avec unListView
ou tout ce qui peut défiler. Il est destiné à être utilisé avec des en-têtes et des pieds de page :)Essentiellement, prenez tout le contenu au-dessus de votre ListView, placez-le dans un autre fichier .xml en tant que mise en page, puis dans le code, gonflez-le et ajoutez-le à la liste sous forme d'en-tête.
c'est à dire
la source
Je sais que ça fait si longtemps mais j'ai eu ce problème aussi, j'ai essayé cette solution et ça marche. Je suppose donc que cela peut aussi aider les autres.
J'ajoute android: fillViewport = "true" sur la mise en page xml pour le scrollView. Donc, globalement, mon ScrollView sera comme ça.
Et cela fonctionne comme par magie pour moi. le ListView qui se trouve à l'intérieur de mon ScrollView se développe à nouveau à sa taille.
Voici l'exemple de code complet pour ScrollView et ListView.
la source
Vous créez un ListView personnalisé qui n'est pas défilable
Dans votre fichier de ressources de mise en page
Dans le fichier Java, créez un objet de votre customListview au lieu de ListView comme: NonScrollListView non_scroll_list = (NonScrollListView) findViewById (R.id.lv_nonscroll_list);
la source
vous pouvez utiliser ce code pour listview dans scrollview
la source
ListView
intérieurRecyclerView
pour montrer plus que le 1er élément.Vous pouvez le résoudre en ajoutant
android:fillViewport="true"
à votre ScrollView.avant d'utiliser cette propriété, il n'y avait qu'un seul enfant de ma vue de liste visible. après avoir utilisé toutes les lignes ou l'enfant de la liste sont visibles.
la source
Ne faites rien dans Parent ScrollView. Ne faites cela que pour ListView enfant. Tout fonctionnera parfaitement.
la source
Ce code résoudra votre problème si vous avez implémenté uniquement un ListView dans un code.
Si vous utilisez RelativeLayout en tant qu'enfant ListView, ce code renvoie une exception NullPointerException ici listItem.measure (0, 0); , en raison de RelativeLayout.Et la solution est de placer votre Relativelayout dans un LinearLayout et cela fonctionnera bien.
la source
Je le laisse ici au cas où quelqu'un serait confronté au même problème. J'ai dû mettre un ListView dans un ScrollView. ListView avec en-tête n'était pas une option pour plusieurs raisons. Il n'était pas non plus possible d'utiliser LinearLayout au lieu de ListView. J'ai donc suivi la solution acceptée, mais cela n'a pas fonctionné car les éléments de la liste avaient une disposition complexe avec plusieurs lignes et chaque élément de la liste était de hauteur variable. La hauteur n'a pas été mesurée correctement. La solution consistait à mesurer chaque élément de la méthode getView () de l'adaptateur ListView.
la source
Vous pouvez facilement mettre ListView dans ScrollView! Il suffit de changer la hauteur de ListView par programme , comme ceci:
Cela fonctionne parfaitement!
la source
Fait après beaucoup de R&D:
fragment_one.xml devrait ressembler à:
Votre classe Java de FragmentOne.java ressemble à:
onCreateView
la source
J'ai eu un problème similaire au problème posé par l'affiche originale - comment faire défiler la vue de liste à l'intérieur de la vue de défilement - et cette réponse a résolu mon problème. Désactiver le défilement d'un ListView contenu dans un ScrollView
Je n'ai pas appelé de nouveaux fragments dans des dispositions existantes ou quelque chose comme ça, comme le faisait l'OP, donc mon code ressemblerait à ceci:
Fondamentalement, ce que je fais est de vérifier la longueur de la vue de liste avant de l'appeler et lorsque je l'appelle, j'en fais cette longueur. Dans votre classe java, utilisez cette fonction:
Et appelez la fonction comme ceci:
Le résultat est une vue de liste sans barre de défilement, toute la longueur de la vue de liste étant affichée, qui défile avec la barre de défilement de la vue de défilement.
la source
Comme d'autres l'ont déjà mentionné, n'utilisez pas ListView dans un ScrollView.
Pour contourner ce problème, vous pouvez utiliser un LinearLayout, mais pour garder les choses propres - remplissez votre LinearLayout avec un adaptateur, comme vous le feriez avec un ListView
Vous pouvez utiliser cette classe comme remplacement LinearLayout qui prend en charge les adaptateurs
la source
Vous pouvez tout mettre en disposition linéaire. Autrement dit, créez une disposition linéaire et elle aura 2 enfants, scrollview et une autre disposition linéaire. Donnez-leur des poids de mise en page et c'est parti:
la source
Vous ne devez jamais utiliser un ScrollView avec un ListView, car ListView s'occupe de son propre défilement vertical. Plus important encore, cela annule toutes les optimisations importantes de ListView pour traiter les grandes listes, car elle oblige efficacement ListView à afficher l'intégralité de sa liste d'éléments pour remplir le conteneur infini fourni par ScrollView.
http://developer.android.com/reference/android/widget/ScrollView.html
la source
Mon exigence est d'inclure un ListView d'éléments de taille égale dans un ScrollView. J'ai essayé quelques-unes des autres solutions répertoriées ici, aucune ne semblait dimensionner correctement le ListView (soit trop peu d'espace, soit trop). Voici ce qui a fonctionné pour moi:
J'espère que cela aide quelqu'un.
la source
Ne mettez JAMAIS l'
ListView
intérieur d'unScrollView
! Vous pouvez trouver plus d'informations sur ce sujet sur Google . Dans votre cas, utilisez unLinearLayout
au lieu deListView
et ajoutez les éléments par programmation.la source
Mettre à jour
à
Le point ici est que vous essayez de définir la hauteur à 0dp (fixe)
la source
trouvé une solution pour scrollview -> viewpager -> FragmentPagerAdapter -> fragment -> dynamic listview, mais je ne suis pas l'auteur. il y a des bugs, mais au moins ça marche
la disposition des fragments peut être n'importe quoi
puis quelque part juste
la source
Pour utiliser la vue de liste dans la vue de défilement, vous pouvez suivre ces étapes qui ont fonctionné pour moi:
1) Créez un fichier java NonScrollListView qui désactive la propriété de défilement par défaut de list-view. et le code est ci-dessous
2) Maintenant, créez un fichier xml qui a
NestedScrollView
et à l'intérieur de cette utilisationNonScrollListView
pour lister vos articles. Cela fera défiler votre écran entier avec toutes les vues.3) Maintenant dans la classe java, c'est-à-dire home.java define
NonScrollListView
au lieu deListview
.la maison de classe publique étend Fragment {int pos = 0; ViewFlipper v_flipper;
Remarque: je l'ai utilisé
Fragments
ici.la source
Ok, voici ma réponse. La méthode qui fixe la hauteur de ListView est suffisamment fermée, mais pas parfaite. Dans le cas où la plupart des articles ont la même hauteur, cela fonctionne bien. Mais dans le cas contraire, il y a un gros problème. J'ai essayé plusieurs fois, et quand j'ai mis la valeur de listItem.getMeasureHeight et listItem.getMeasuerWidth dans le journal, j'ai vu les valeurs de largeur varier beaucoup, ce qui n'est pas prévu ici, car tous les éléments du même ListView devraient ont la même largeur. Et voilà le bug:
Certains ont utilisé la mesure (0, 0), ce qui a rendu la vue non liée, dans les deux sens, et la largeur s'est déchaînée. Certains ont essayé d'obtenir la largeur de listView, mais ils renvoient 0, sans signification.
Lorsque je lis plus loin comment Android rend la vue, je me rends compte que toute cette tentative ne peut pas atteindre la réponse que j'ai recherchée, à moins que ces fonctions ne s'exécutent après le rendu de la vue.
Cette fois, j'utilise le getViewTreeObserver sur le ListView que je veux fixer la hauteur, puis addOnGlobalLayoutListener. À l'intérieur de cette méthode, je déclare un nouveau OnGlobalLayoutListener, dans lequel, cette fois, getWidth retourne la largeur réelle du ListView.
Le bloc de valeurs est le remplissage que j'ai défini dans la disposition ListView.
la source
Si pour une raison quelconque vous ne voulez pas utiliser
addHeaderView
etaddFooterView
, par exemple lorsque vous avez plusieurs listes, une bonne idée serait de réutiliserListAdapter
pour remplir un simpleLinearLayout
donc il n'y a pas de fonctionnalité de défilement.Si vous avez déjà un fragment entier dérivé de
ListFragment
et que vous souhaitez le convertir en un fragment similaire avec simpleLinearLayout
sans faire défiler à la place (par exemple pour le mettre dans ScrollView), vous pouvez implémenter un fragment d'adaptateur comme ceci:Vous pouvez également transmettre
onCreate
,onPause
,onResume
, etc. au fragment d' origine en fonction de vos besoins ou essayez l' héritage au lieu de la composition (mais remplacer certaines méthodes si fragment original n'est pas réellement attaché à la hiérarchie de mise en page); mais je voulais isoler autant que possible le fragment original, car il suffit d'extraire son fragmentListAdapter
. Si vous appelez de fragment d' originesetListAdapter
de dansonAttach
, c'est probablement suffisant.Voici comment utiliser
ListAsArrayFragment
pour inclureOriginalListFragment
sans faire défiler. Dans l'activité parentaleonCreate
:la source
trouvé une solution pour scrollview -> viewpager -> FragmentPagerAdapter -> fragment -> dynamic listview, mais je ne suis pas l'auteur.
la disposition des fragments peut être n'importe quoi
puis quelque part juste
la source
utiliser ce ListView a fonctionné pour moi
et en xml
et dans MainActivity
Reportez-vous à cet article pour plus d'informations et pour savoir comment conserver la vue de grille dans la vue de défilement
la source
En xml:
En Java:
la source
Définissez simplement la valeur de la hauteur requise dans un attribut de hauteur listview à l'intérieur d'une scrollview parent. Il défilera avec l'élément enfant des autres parents.
la source
Cela a fonctionné pour moi ( link1 , lien2 ):
Vous créez un ListView personnalisé qui n'est pas défilable
Dans votre fichier de mise en page
Créez un objet de votre customListview au lieu de ListView comme:
la source
Appelez simplement cette fonction après avoir assigné l'adaptateur à listview
la source
la source
meilleur code
la source