web-dev-qa-db-fra.com

Désactiver le défilement d'un ListView contenu dans un ScrollView

Je souhaite afficher un écran de profil pour mes utilisateurs.

Il doit avoir trois vues (2 Buttons et une ImageView) et une ListView pour afficher le contenu créé par cet utilisateur.

Cependant, je ne veux pas que la ListView défile. Au lieu de cela, je veux qu’elle soit aussi grande que nécessaire et que toutes mes vues soient dans une ScrollView, afin que les trois premières vues défilent avec la ListView. Ceci, bien sûr, ne fonctionne pas comme prévu.

Tous mes trois articles sont à l'intérieur d'une LinearLayout. J'ai pensé en faire le premier élément de la ListView, mais cela les amène à être sélectionnables en tant que premier élément et à devoir coder inutilement. 

Y a-t-il un moyen de le faire facilement ou devrais-je m'en tenir à faire de la mise en page le premier élément de mon ListView?

32
1CjaWfbSbARo

Les ajouter à ListView en tant que premier élément semble être une très bonne solution.

Pour rendre la vue non sélectionnable, il suffit d’obtenir la vue et la fonction .setClickable(false).

7
Yalla T.

J'ai trouvé une solution très simple pour cela. Procurez-vous simplement l'adaptateur de la liste et calculez sa taille lorsque tous les éléments sont affichés ..__ L'avantage est que cette solution fonctionne également à l'intérieur d'une ScrollView.

Exemple:

public static void justifyListViewHeightBasedOnChildren (ListView listView) {

    ListAdapter adapter = listView.getAdapter();

    if (adapter == null) {
        return;
    }
    ViewGroup vg = listView;
    int totalHeight = 0;
    for (int i = 0; i < adapter.getCount(); i++) {
        View listItem = adapter.getView(i, null, vg);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams par = listView.getLayoutParams();
    par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
    listView.setLayoutParams(par);
    listView.requestLayout();
}

Appelez cette fonction en passant sur votre objet ListView:

justifyListViewHeightBasedOnChildren(myListview);

La fonction indiquée ci-dessus est une modidication d’une publication dans: Désactiver le défilement dans ListView

Veuillez noter que vous devez appeler cette fonction après avoir configuré l'adaptateur pour la liste. Si la taille des entrées de l'adaptateur a changé, vous devez également appeler cette fonction.

45
Chris623

Vous pouvez le faire en

listView.setScrollContainer(false);

pour plus s'il vous plaît vérifier 

Comment obtenir un ListView non-scrollable?

11
Saifuddin Sarker

J'ajouterais un View avec un fond invisible au-dessus de ListView. Définissez une View.OnTouchListener() pour cela. Et utilisez l'événement en renvoyant true dans onTouch(), méthode de View.OnTouchListener()

Lorsque vous souhaitez que la liste défile de nouveau, supprimez le programme d'écoute tactile défini sur le transparent View.

5
Sudarshan Bhat

si vous devez afficher un nombre limité d'éléments dans la vue liste et que vous souhaitez empêcher le défilement de la vue liste, vous devez conserver une hauteur de vue vue supérieure à la hauteur totale des éléments. 

par exemple, vous souhaitez afficher 3 éléments. (la hauteur de la rangée est 30). alors la hauteur totale des articles devient 3 x 30dp = 90dp,

alors maintenant, vous devez définir une hauteur de liste supérieure à 90. Par exemple: 100dp. alors maintenant, votre listview ne défilera en aucun cas. 

4
Usman Nisar

Je pense que le meilleur moyen serait de placer les 2 boutons et la vue d'image dans un LinearLayout (ou toute disposition qui correspond à vos besoins) et d'ajouter cette disposition comme en-tête de liste à l'aide de la méthode addHeaderView:

http://developer.Android.com/reference/Android/widget/ListView.html#addHeaderView(Android.view.View )

2
Olivier Bonal

avec l'instruction suivante: 

name_lista.getLayoutParams (). height = new_size

new_size est une variable que vous calculerez en fonction du nombre d'éléments de votre liste, par exemple:

new_size = 100 * list_size;
0
fredy