78 votes

Cacher la vue de pied de page dans ListView ?

J'ai un ListView. Les données derrière, c'est récupérée à partir de l'Internet, dans des séries de 10 à 30 éléments à chaque fois que l'utilisateur fait défiler tout le chemin vers le bas. Afin d'indiquer qu'il est en cours de chargement plus d'articles, j'ai utilisé addFooterView() ajouter un simple point de vue qui affiche un message "Chargement..." et un compteur. Maintenant, quand je suis sorti de données (pas plus de données à récupérer), je veux cacher ce message. J'ai essayé de faire:

loadingView.setVisibility(View.GONE);

Malheureusement, bien que cela ne cacher la vue, ce qui laisse un espace pour elle. I. e. Je me retrouve avec un grand espace vide où le message "Chargement". Comment puis-je aller sur la bonne manière de cacher ce point de vue?

Je ne peux pas utiliser removeFooterView() parce que j'ai peut-être besoin de l'afficher de nouveau, dans ce cas, je ne peux pas appeler addFooterView() encore parce qu'une carte a déjà été mis sur l' ListView, et vous ne pouvez pas appeler addHeaderView() / addFooterView() après la fixation d'un adaptateur.

84voto

Felix Points 33944

Il me semble que vous êtes autorisé à téléphoner addHeaderView() / addFooterView() après setAdapter() aussi longtemps que vous appelez l'une de ces méthodes au moins une fois avant. C'est plutôt une mauvaise décision de conception à partir de Google, j'ai donc déposé un problème. Combinez cela avec removeFooterView() et vous avez ma solution.

+1 pour les deux autres réponses que j'ai eu, ils sont valides (et sans doute plus correct) des solutions. La mienne, cependant, est la plus simple, et j'aime la simplicité, donc je vais marquer mon propre réponse acceptée.

37voto

Yoni Samlan Points 21748

Essayez de définir la hauteur du pied de page ou 0px 1px avant de le cacher. Alternativement, envelopper l’affichage du pied de page dans un hauteur et masquer/afficher la vue intérieure, laissant le `` visible ; la hauteur devrait envelopper correctement ensuite.

5voto

preceptron Points 46

dans mon cas addFooterView / removeFooterView() causer quelques artéfacts. Et j’ai trouvé d’autre solution. J’ai utilisé le FrameLayout comme FooterView. Et quand je veux ajouter un pied de page j’ai appelé mFrameFooter.addView(myFooter) ; et mFrameFooter.removeAllViews() ; pour les supprimer.

4voto

rwat Points 693

La bibliothèque de Droid-Fu a une classe conçue pour avoir un pied de page de chargement afficher et masquer : ListAdapterWithProgress.

2voto

kouretinho Points 131

@YoniSamlan l'a souligné, il peut être réalisé de manière simple. Vous devez spécifier

android:layout_height="wrap_content" 

dans le ViewGroup qui contient le "Charger Plus" bouton. N'a pas à être FrameLayout, voir ci-dessous pour un simple travail - exemple qui utilise un LinearLayout.

Les deux images montrent un écran qui défile tout le chemin vers le bas. La première a une visible de pied qui s'enroule autour de la "charger plus" bouton. Deuxième images montre que le pied de page s'effondre si vous réglez le bouton de la visibilité à DISPARU.

Vous pouvez afficher à nouveau le pied de page (à l'intérieur de certaines de rappel) par modification de la visibilité:

loadMore.setVisibility(View.VISIBLE);  // set to View.GONE to hide it again

listView with visible footerlistView with footer gone

Effectuer listView d'initialisation comme d'habitude

    // Find View, set empty View if needed
    mListView = (ListView) root.findViewById(R.id.reservations_search_results);
    mListView.setEmptyView(root.findViewById(R.id.search_reservations_list_empty));

    // Instantiate footerView using a LayoutInflater and add to listView
    footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE))
            .inflate(R.layout.load_more_footer_view, null, false);
    // additionally, find the "load more button" inside the footer view
    loadMore = footerView.findViewById(R.id.load_more);
    loadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fetchData();
        }
    });

    // add footer view to the list
    mListView.addFooterView(footerView);

    // after we're done setting the footerView, we can setAdapter
    adapter = new ReservationsArrayAdapter(getActivity(), R.layout.list_item_reservations_search, reservationsList);
    mListView.setAdapter(adapter);

load_more_footer_view.xml

<?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">

<Button
    android:id="@+id/load_more"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="9dp"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@drawable/transparent_white_border"
    android:textColor="@android:color/white"
    android:text="@string/LOAD_MORE"/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X