Comment définir l'application RecyclerView: layoutManager = "" à partir de XML?

167

Comment définir RecyclerView layoutManager à partir de XML?

    <android.support.v7.widget.RecyclerView
        app:layoutManager="???"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
Ilya Gazman
la source
Voir la documentation: recyclerview: layoutManager
dieter_h
1
@dieter_h pouvez-vous fournir une réponse avec l'exemple GridLayoutManager?
Ilya Gazman
4
Vous pouvez utiliser app:layoutManager="android.support.v7.widget.GridLayoutManager". Constructor avec quatre arguments seront utilisés ( Context, AttributeSet, int, int). Selon la documentation, c'est le constructeur utilisé lorsque le gestionnaire de mise en page est défini en XML par l'attribut layoutManager de RecyclerView. Si spanCount n'est pas spécifié dans le XML, la valeur par défaut est une seule colonne
thetonrifles

Réponses:

269

Comme vous pouvez le vérifier dans le document:

Nom de classe du Layout Managerà utiliser.

La classe doit s'étendre androidx.recyclerview.widget.RecyclerViewView$LayoutManageret avoir un constructeur par défaut ou un constructeur avec la signature(android.content.Context, android.util.AttributeSet, int, int)

Si le nom commence par a '.', le package d'application est préfixé. Sinon, si le nom contient un '.', le nom de classe est supposé être un nom de classe complet. Sinon, le package de vue du recycleur ( androidx.appcompat.widget) est préfixé

Avec androidx, vous pouvez utiliser:

<androidx.recyclerview.widget.RecyclerView
     xmlns:app="http://schemas.android.com/apk/res-auto"
     app:layoutManager="androidx.recyclerview.widget.GridLayoutManager">

Avec les bibliothèques de support, vous pouvez utiliser:

<android.support.v7.widget.RecyclerView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:layoutManager="android.support.v7.widget.GridLayoutManager" >

Vous pouvez également ajouter ces attributs:

  • android:orientation= "horizontal|vertical": Pour contrôler l'orientation de la LayoutManager (par exemple LinearLayoutManager)
  • app:spanCount: pour définir le nombre de colonnes pour GridLayoutManager

Exemple:

<androidx.recyclerview.widget.RecyclerView
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
    app:spanCount="2"
    ...>

ou:

<androidx.recyclerview.widget.RecyclerView
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    android:orientation="vertical"
    ...>

Vous pouvez également les ajouter en utilisant l' toolsespace de noms (c'est-à tools:orientation- dire et tools:layoutManager), puis cela n'a d'impact que sur l'aperçu de l'EDI et vous pouvez continuer à définir ces valeurs dans le code.

Gabriele Mariotti
la source
77
Et vous pouvez utiliser android:orientationl'élément RecyclerView pour contrôler l'orientation de, par exemple, LinearLayoutManager
androidguy
3
@Gabriele Mariotti J'ai vérifié l'implémentation et elle utilise la réflexion. Est-ce correct du point de vue des performances?
Ahmad Fadli
4
Y a-t-il plus d'attributs disponibles au cas où j'utiliserais GridLayoutManager? Est-il possible de définir son nombre de colonnes (spanCount)?
développeur android
8
@androiddeveloper Oui, par exemple, pour le définir sur trois colonnes, utilisez app: spanCount = "3"
jauser
2
vous pouvez également utiliser tools:layoutManager, tools:spanCount(même si l'auto-complétion ne l'affiche pas) et si vous ne voulez pas remplacer l'une de vos configurations de
recyclage
88

si vous voulez l'utiliser avec LinearLayoutManager

<android.support.v7.widget.RecyclerView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager" >

cela équivaut à

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(mLayoutManager);
Mina Fawzy
la source
2
Quel est votre ajout à la réponse de Gabriele Mariotti?
Ilya Gazman
4
expliquer ce que l'équivalent dans le code mais avec un autre exemple LinearLayout
Mina Fawzy
7
@UdiOshi pour le rendre horizontal, vous devez ajouter android:orientation="horizontal"au xml RecyclerView
rf43
7
androidx.recyclerview.widget.LinearLayoutManager pour androidX
frapeti
82

Et je suis venu ici à la recherche d'une androidxversion bien que c'était assez facile à comprendre, la voici

LinearLayoutManager:

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"

Exemple:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

GridLayoutManager:

app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"

Exemple:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:spanCount="2"
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"/>

Comme vous pouvez le voir dans les exemples ci-dessus, vous pouvez contrôler l'orientation de l'intérieur en xmlutilisant

android:orientation="vertical"

et

android:orientation="horizontal"

Et pour définir le nombre de colonnes pour GridLayoutManager à l' aide de

app:spanCount="2"
Max
la source
10
Vous pouvez définir no. de colonnes lorsque vous utilisez GridLayoutManageren ajoutantapp:spanCount="2"
Pratik Butani
future approche compatible.
Abhinav Saxena
Même chose ici ... Androidx sur le point de décoller 🚀
Robin Hood
1
Merci, je cherchais spanCounttrouvé ici. C'est pourquoi voter pour la réponse :)
Jimit Patel
16

Les plus courants que j'utilise sont:

<androidx.recyclerview.widget.RecyclerView
    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" 
    tools:listitem="@layout/grid_item"
    android:orientation="vertical" app:spanCount="3"/>

Et:

<androidx.recyclerview.widget.RecyclerView
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    tools:listitem="@layout/grid_item"
    android:orientation="vertical"/>

Il est recommandé de définir listitem, afin que vous voyiez à quoi cela pourrait ressembler dans l'aperçu de l'éditeur de mise en page.

Si vous voulez que l'ordre soit inversé, je pense que vous devez le faire dans le code à la place, et utiliser des "outils" en XML si vous voulez vraiment voir quelque chose ...

développeur android
la source
quel est appset les appespaces de noms que vous avez utilisés dans le xml ci-dessus? parce que j'obtiens une erreur de temps de construction Android resource linking failed - AAPT: error: attribute orientation, si j'utilise app:orientation.
Omkar
merci, mais c'est toujours un mauvais espace de noms. Ça devrait être androidpour orientation. Cela ne fonctionne pas avec l' appespace de noms, tout le reste est parfait.
Omkar
@Omkar Corrigez à nouveau. Désolé. Actualisé.
développeur android