web-dev-qa-db-fra.com

Étendre plusieurs colonnes avec RecyclerView

Donc, ce que j'essaie de faire, c'est d'avoir une disposition échelonnée, mais le premier élément de la liste doit s'étendre sur deux colonnes. Les deux premières rangées ont également une hauteur fixe. J'ai tout fonctionne sauf le premier élément s'étendant sur deux colonnes.

J'utilise RecyclerView.Adapter avec StaggeredGridLayoutManager. Il ne semble pas que ce soit une fonctionnalité prête à l'emploi. Je suppose que je peux créer un gestionnaire de mise en page personnalisé, je ne sais pas par où commencer. J'ai essayé de rechercher, mais je ne trouve rien sur la façon d'obtenir des éléments sur plusieurs colonnes.

L'image ci-dessous est ce que je recherche dans la liste.

Staggered layout

48
DDukesterman

Actuellement, StaggeredGridLayoutManager ne prend en charge que les vues qui couvrent toutes les colonnes (pour une disposition configurée verticalement), et non un nombre arbitraire d'entre elles.

Si vous souhaitez toujours les répartir sur toutes les colonnes, vous devez le faire dans l'implémentation de l'adaptateur:

public final void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

    StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams();
    layoutParams.setFullSpan(true);
}

À mon humble avis, StaggeredGridLayoutManager est toujours en cours de développement et Google veut que nous l'utilisions pour les commentaires :(

50
mato

Ce que j'ai fait pour couvrir toutes les colonnes pour une disposition configurée verticalement a été de créer un nouveau LayoutParams et de définir la pleine portée sur true dans l'implémentation de l'adaptateur:

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {

    StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    layoutParams.setFullSpan(true);
    viewHolder.itemView.setLayoutParams(layoutParams);
}
9
ljmelgui