Bonjour. J'écris ce genre de chose pour la première fois, donc je ne sais pas quoi faire, mais merci.
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:
 
//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);
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;
}
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