Masquer la vue de bas de page dans ListView?

J’ai un ListView . Les données se trouvant derrière elle sont extraites d’Internet, par lots de 10 à 30 éléments, à chaque fois que l’utilisateur fait défiler la page jusqu’en bas. Afin d’indiquer qu’il charge plus d’éléments, j’ai utilisé addFooterView() pour append un affichage simple qui affiche un message “Chargement …” et un compteur. Maintenant, quand je suis à court de données (plus de données à récupérer), je veux masquer ce message. J’ai essayé de faire:

 loadingView.setVisibility(View.GONE); 

Malheureusement, bien que cela cache la vue, cela laisse de la place pour cela. Ie je me retrouve avec un grand espace vide où le message “Loading” était. Comment puis-je faire pour cacher correctement cette vue?

Je ne peux pas utiliser removeFooterView() car il se peut que je removeFooterView() afficher à nouveau, auquel cas je ne peux pas appeler addFooterView() car un adaptateur a déjà été défini sur ListView , et vous ne pouvez pas appeler addHeaderView() / addFooterView() après avoir défini un adaptateur.

Il semble que vous soyez autorisé à appeler addHeaderView() / addFooterView() après setAdapter() tant que vous appelez une de ces méthodes au moins une fois auparavant . C’est une décision de conception plutôt médiocre de la part de Google, alors j’ai déposé un problème . Combinez ceci avec removeFooterView() et vous avez ma solution.

+1 pour les deux autres réponses que j’ai obtenues, ce sont des solutions valides (et sans doute plus correctes). Le mien, cependant, est le plus simple et j’aime la simplicité, alors je vais marquer ma propre réponse comme acceptée.

Essayez de régler la hauteur du pied de page à 0px ou 1px avant de le cacher. Vous pouvez également wrap_content vue de pied de page dans une hauteur FrameLayout et masquer / afficher la vue interne, laissant le FrameLayout visible; la hauteur devrait bien s’enrouler alors.

dans mon cas, addFooterView / removeFooterView () provoque des artefacts. Et j’ai trouvé une autre solution. J’ai utilisé FrameLayout comme FooterView. Et quand je veux append le pied de page, j’ai appelé mFrameFooter.addView (myFooter); et mFrameFooter.removeAllViews (); pour enlever.

 FrameLayout frameLayout = new FrameLayout(this); listView.addFooterView(frameLayout); ...... ...... //For adding footerView frameLayout.removeAllViews(); frameLayout.addView(mFooterView); //For hide FooterView frameLayout.removeAllViews(); 

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

Fonctionne bien dans mon projet:

1.Ajoutez d’abord le pied de page

mListView.addFooterView(mFooterView); mListView.setAdapter(mAdapter);

Visibilité 2.Set

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, 0, 0, 0);

3. Réglez l’invisibilité

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, -1*mFooterView.getHeight(), 0, 0);

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

 android:layout_height="wrap_content" 

dans le ViewGroup qui contient le bouton “Charger plus”. Il n’est pas nécessaire d’être FrameLayout, voir ci-dessous un exemple de travail simple utilisant un LinearLayout.

Les deux images montrent un écran qui défile jusqu’au fond. Le premier a un pied de page visible qui entoure le bouton “charger plus”. Les secondes images montrent que le pied de page se réduit si vous définissez la visibilité du bouton sur GONE.

Vous pouvez afficher à nouveau le pied de page (dans certains callbacks) en modifiant la visibilité:

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

listView avec pied de page visiblelistView avec le pied de page parti

Exécuter l’initialisation listView 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"?>   

Ce devrait être un bug d’Android.

Vous n’avez pas besoin de supprimer ou d’append dynamicment une vue de bas de page. Il vous suffit de créer une mise en page parent de hauteur non spécifiée (soit la gonfler à partir d’un fichier xml ou la créer par programmation), puis append votre vue que vous souhaitez masquer ou afficher.

Et vous pouvez définir la vue, mais PAS la mise en page parent, sur VISIBLE ou GONE ou autre chose maintenant. Ça marche pour moi.

Utilisé

 footer.removeAllViews(); 

Cela ne supprime pas le pied de page mais rince les enfants. Vous devez encore repeupler les enfants. Peut vérifier par

 footer.getChildCount()<2 

J’ai aussi trouvé que c’est un appel possible onContentChanged() (si vous utilisez ListActivity ) pour forcer recréer ListView si je dois leur append HeaderView après l’appel setAdapter() , mais c’est un hack très laid.

J’ai créé un ListView qui gère cela. Il a également la possibilité d’utiliser EndlessScrollListener que j’ai créé pour gérer les vues en liste sans fin, qui charge les données jusqu’à ce qu’il n’y ait plus de données à charger.

Vous pouvez voir ces classes ici:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java – Aide permettant d’utiliser le fonctionnalités sans sortir de SimpleListViewWithLoadingIndicator.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java – Auditeur qui commence à charger des données lorsque l’utilisateur est sur le point d’atteindre le bas de la liste.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java – The EndlessListView. Vous pouvez utiliser cette classe directement ou la prolonger.

J’ai un petit moyen de piratage pour résoudre ce problème partout. Placez la vue liste et le pied de page (juste la sous-mise en page) dans la mise en page parent comme LinnearLayout, rappelez-vous cette vue de dessous sous listview.

Contrôler cette vue de bas de page et la visibilité comme la vue nominale. Et fait!

D’abord, j’ajoute mon pied de page à la liste, comme ceci

 listView.addFooterView(Utils.b); 

Puis sur le clic du bouton, je supprime la vue,

 listView.removeFooterView(Utils.b); 

J’ajoute le pied de page à chaque fois que je frappe l’async, et ce n’est pas une entrée en double.Je pourrais aussi vérifier le compte et ainsi il ressemble à ceci,

 if(listView.getFooterViewsCount() > 0){//if footer is added already do something} 

Lorsque vous souhaitez supprimer le pied de page dans ListView appelez simplement

 listView.addFooterView(new View(yourContext)); 

Il appenda une vue vide factice qui ne réservera aucun espace