[JAVA] Présentation de ce que j'ai fait lorsque je voulais ajouter un en-tête et un pied de page à RecyclerView

Bonjour. J'écris ce genre de chose pour la première fois, donc je ne sais pas quoi faire, mais merci.

Synopsis

J'ai utilisé ListView dans une application Android ↓ Je souhaite utiliser la mise en page du coordinateur ↓ Utilisons RecyclerView ↓ Je ne peux pas joindre l'en-tête et le pied de page ↓ J'ai fait un adaptateur pour pouvoir attacher un en-tête et un pied de page ↑ Je vais vous présenter l'adaptateur que j'ai fait à ce moment. (Je l'ai mis sur GitHub.) J'espère que cela aide quelqu'un. (Je me demande s'il existe déjà) Je suis désolé s'il y a quelque chose qui ne va pas. : bow_tone1:

Comment utiliser l'adaptateur que vous avez créé

//Créez l'adaptateur que vous souhaitez utiliser
MyAdapter adapter = new MyAdapter();

//Créer PaneRecyclerViewAdapter
PaneRecyclerViewAdapter paneRecyclerViewAdapter = new PaneRecyclerViewAdapter(adapter); //Je te donnerai un adaptateur

//Si c'est GridView, je vais vous donner LayoutManager
//paneRecyclerViewAdapter.setGridLayoutManager(gridLayoutManager);

//Donner une vue de l'en-tête et du pied de page
paneRecyclerViewAdapter.setHeaderView(headerView);
paneRecyclerViewAdapter.setFooterView(footerView);

//Ajouter PaneRecyclerVieAdapter à RecyclerView
recyclerView.setAdapter(paneRecyclerViewAdapter);

Expliquez légèrement le mouvement

Obtenez l'adaptateur principal dans le constructeur. En gros, laissez ce type bouger sur le côté.

public PaneRecyclerViewAdapter(RecyclerView.Adapter adapter) {
    mAdapter = adapter;
}

Triez les types de manière appropriée.

@Override
public int getItemViewType(int position) {
    if(isHeader(position)) {
        return ITEM_VIEW_TYPE_HEADER;
    }
    if(isFooter(position)) {
        return ITEM_VIEW_TYPE_FOOTER;
    }

    return ITEM_VIEW_TYPE_ITEM;
}

private boolean isHeader(int position) {
    return mHeaderView != null && position == 0;
}

private boolean isFooter(int position) {
    int extraCount = mHeaderView != null ? 1 : 0;
    return mFooterView != null && position == mAdapter.getItemCount() + extraCount;
}

Le nombre d'éléments est renvoyé en ajoutant le nombre d'en-têtes et de pieds de page.

@Override
public int getItemCount() {
    int extraCount = 0;
    if(mHeaderView != null) extraCount += 1;
    if(mFooterView != null) extraCount += 1;
    return mAdapter.getItemCount() + extraCount;
}

ViewHolder, qui est un élément ordinaire, est créé par l'adaptateur que vous avez reçu.

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == ITEM_VIEW_TYPE_HEADER) {
        return new ViewHolder(mHeaderView);
    }

    if(viewType == ITEM_VIEW_TYPE_FOOTER) {
        return new ViewHolder(mFooterView);
    }

    RecyclerView.ViewHolder viewHolder = mAdapter.onCreateViewHolder(parent, viewType);
    return new ViewHolder(viewHolder);
}

À propos, le support de vue de Pane Recycler ressemble à ce qui suit. Les éléments ordinaires sont conservés dans le type brut ViewHolder et remis en cas de besoin. L'en-tête et le pied de page sont déjà affichés, ils sont donc laissés au flux latéral.

static class ViewHolder extends RecyclerView.ViewHolder {
    private RecyclerView.ViewHolder mItemViewHolder;

    ViewHolder(View itemView) {
        super(itemView);
    }

    ViewHolder(RecyclerView.ViewHolder viewHolder) {
        super(viewHolder.itemView);
        mItemViewHolder = viewHolder;
    }

    RecyclerView.ViewHolder getItemViewHolder() {
        return mItemViewHolder;
    }
}

OnBind est également laissé à l'adaptateur qui a reçu l'élément ordinaire. HeaderFooter n'a rien à faire, vous ne devriez donc rien faire

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if(isHeader(position)) return;
    if(isFooter(position)) return;
    int extraCount = mHeaderView != null ? 1 : 0;
    mAdapter.onBindViewHolder(holder.getItemViewHolder(), position - extraCount);
}

Au moment de GridLayout, je veux que HeaderFooter soit plein sur le côté, donc SpanSizeLookup? Cela semble être réglé avec. Linear est plein de monde, vous n'avez donc rien à faire. J'essaie de faciliter la configuration, mais si vous voulez l'installer à l'extérieur, vous pouvez le faire. (Si vous utilisez getSpanSize préparé ci-dessous, vous devriez pouvoir le faire à l'extérieur)

public void setGridLayoutManager(GridLayoutManager gridLayoutManager) {
    mSpanCount = gridLayoutManager.getSpanCount();
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return PaneRecyclerViewAdapter.this.getSpanSize(position);
        }
    });
}
public int getSpanSize(int position) {
    if(isHeader(position) || isFooter(position)) {
        return mSpanCount;
    }
    return 1;
}

fin

Vous n'auriez rien dû faire de difficile. Cependant, à ce moment-là, je l'ai fait en disant bonjour. S'il vous plaît laissez-moi savoir si vous en avez. Excusez-moi. : walking_tone1:

Github https://github.com/syuki/PaneRecyclerViewAdapter

Recommended Posts

Présentation de ce que j'ai fait lorsque je voulais ajouter un en-tête et un pied de page à RecyclerView
Je voulais animer une ligne lors de l'utilisation de realm et RecyclerView sur Android, mais j'ai abandonné
Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
Que faire lorsqu'une exception javax.el.PropertyNotWritableException se produit
J'ai créé un bot de transaction d'arbitrage de monnaie virtuelle et essayé de gagner de l'argent
Je voulais ajouter @VisibleForTesting à la méthode
[Rails] [Note] Quand ajouter = à <%%> et quand pas
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai créé un conteneur Docker pour exécuter Maven
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
Je souhaite établir une connexion lorsqu'une base de données est créée à l'aide de Spring et MyBatis
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Comment créer un en-tête ou un pied de page une fois et l'utiliser sur une autre page
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai fait une méthode pour demander la prime vendredi
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai créé un serveur et un client Restful au printemps.
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
J'ai ajouté un fichier Jar au chemin de construction dans un projet Eclipse, mais la situation et ce qu'il faut faire lorsque `java.util.zip.ZipException: en-tête LOC invalide (mauvaise signature)` apparaît.
[Rails 6] Que faire lorsqu'une erreur de modèle manquante se produit après l'introduction du haml [Super facile]
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle
Je veux faire une liste avec kotlin et java!
Je veux appeler une méthode et compter le nombre
Je voulais juste créer une propriété réactive en Java
Je veux créer une fonction avec kotlin et java!
J'ai essayé JAX-RS et pris note de la procédure
Ajouter une ombre au bouton Swift (et aussi au cercle)
J'ai créé un Dockerfile pour démarrer Glassfish 5 en utilisant Oracle Java