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