web-dev-qa-db-fra.com

Une grille de page peut-elle avoir un pied de page et une en-tête comme ListView?

Une question rapide:

Dans ListView j'utilise ce code:

list.addHeaderView(headerView);

Comment faire face à cela lorsque vous travaillez sur gridview?

Merci.

26
necixy

Il n'y a pas de support pour les vues d'en-tête ou de pied de page avec GridView, désolé.

32
CommonsWare

Il existe une bonne implémentation de la grille de la GridView avec la prise en charge de l'en-tête dans Google Photos Application, car c'est le code OSS, vous pouvez l'utiliser tel quel ou le prendre comme référence pour votre propre implémentation: http://grepcode.com/file /repository.grepcode.com/java/ext/com.google.Android/android-apps/4.3_r2.1/com/android/Photos/views/headerGridView.java =====

L'idée de base est assez simple - wrapberadapter crée une fausse ligne en augmentant le nombre d'éléments par nombre de colonnes, puis renvoyez une vue d'en-tête pour l'élément.

25
AlexM

enter image description here

Exemple de code:

GridViewWithHeaderAndFooter gridView = (GridViewWithHeaderAndFooter) v.findViewById(R.id.ly_image_list_grid);

LayoutInflater layoutInflater = LayoutInflater.from(this);
View headerView = layoutInflater.inflate(R.layout.test_header_view, null);
View footerView = layoutInflater.inflate(R.layout.test_footer_view, null);
gridView.addHeaderView(headerView);
gridView.addFooterView(footerView);

Buildle Build :.

compile 'in.srain.cube:grid-view-with-header-footer:1.0.12'
5
Ajay Venugopal

Vous pouvez utiliser ceci. Le pied de page apparaît/se cache au bas de la grille lorsque vous atteignez/laissez le dernier nombre d'éléments. Il ne fait pas défiler en fait, mais je remarque à peine la différence.

Dans votre activité/fragment d'ONCreate/OnCreateView, vous ajoutez un Onscrolllistener à la GridView:

    ....
    GridView gridview = (YMAnimatedGridview) v.findViewById(R.id.my_gridview);
    gridview.setAdapter(adapter);
    final View footerView = mainView
            .findViewById(R.id.my_grid_footer_view);
    gridview.setOnScrollListener(new GridView.OnScrollListener() {

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

                if (firstVisibleItem + visibleItemCount == totalItemCount) {

                    // last item in grid is on the screen, show footer:
                    footerView.setVisibility(View.VISIBLE);

                } else if (footerView.getVisibility() != View.GONE) {

                    // last item in grid not on the screen, hide footer:
                    footerView.setVisibility(View.GONE);
                }
            }

        @Override
        public void onScrollStateChanged(AbsListView view,
                int scrollState) {
        }
    });

Votre mise en page devrait ressembler à quelque chose comme ci-dessous. Notez le paramètre Layout_weight (and Layout_Height) dans la grilleView, il est nécessaire de faire le bon espace pour le pied de page lorsqu'il devient visible.

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <GridView
        Android:id="@+id/my_gridview"
        Android:layout_width="match_parent"
        Android:layout_height="0dp"
        Android:columnWidth="160dp"
        Android:gravity="center_horizontal"
        Android:horizontalSpacing="12dp"
        Android:numColumns="auto_fit"
        Android:layout_weight="1"
        Android:stretchMode="columnWidth"
        Android:verticalSpacing="6dp" />

    <TextView
        Android:id="@+id/my_grid_footer_view"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:padding="10dp"
        Android:layout_marginBottom="8dp"
        Android:orientation="horizontal"
        Android:visibility="gone"
        Android:text="footer text here" >
    </TextView>
</LinearLayout>
5
Frank

Que diriez-vous de vérifier l'élément d'index "0" de votre adaptateur? Vous pouvez gonfler la vue personnalisée pour le premier.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
            if(view==null){
                 if(position==0){
                      //  ...inflate header view
                 }else{
                      //  ...do as usual

Je ne l'ai pas testé, mais devrait travailler.

4
milechainsaw

Vous devriez utiliser une liste de réception, puis faire chaque ligne de la liste ressemble à celle d'une rangée d'une grille. Donc, si vous avez une grille de 3 colonnes, vous feriez une mise en page pour la liste de liste qui ressemble à 3 colonnes. Vous devez alors modifier certains aspects de l'adaptateur pour le faire fonctionner afin que chaque ligne ListView représente réellement 3 lignes de données - de sorte que vous sachiez, getcount ()/3 types de types.

4
Tyler

Vous pouvez utiliser asymétricgridView et spécifier des en-têtes/des pieds de page avec un gros rang de rangement afin de prendre toute la ligne.

2
Felipe Lima

Pourquoi ne changez-vous pas l'apparence des cellules pour les premières lignes? Si vous savez combien de colonnes vous avez, vous savez combien d'articles apparaîtront dans l'en-tête = nombre de colonnes.Il fonctionne pour moi

1
Guillaume

Vous pouvez utiliser cette bibliothèque, http://tonicartos.github.io/stickygridheaders/

ce qui vous permet de créer des en-têtes collants (pour regrouper la liste et en gardant l'en-tête visible pour le groupe actuel). Vous pouvez également éteindre la fonctionnalité collante.

1
Matt Wolfe

Il existe un moyen d'accomplir la fonctionnalité souhaitée sans utiliser de bibliothèque ni de rien.

EDIT: Juste emprunter la mise en œuvre de HeaderGridView par Google, voir ICI
[.____] Vous pouvez également le personnaliser pour le pied de page. La suggestion ci-dessous est trop compliquée et nécessitait plus de peaufine. Sans entrer dans des détails spécifiques, tout ce que vous avez à faire est celui-ci.

1) grille de sous-classe
[.____] 2) Remplacer l'échographie
[.____] 3) calculer le décalage chaque fois qu'il fait défiler
[ défilement.
[.____] 5) Évidemment, vous voulez structurer cela bien afin que votre grille puisse avoir une méthode comme AttachtogridView (vue Affichage). J'ai une implémentation complète de cela qui fonctionne.
Voir Décalage de défilement de GridView Pour obtenir de l'aide sur la mise en décalage, car le gridview a un bogue était le point de vue recyclé.

1
Jessicardo