Developpez.com - Rubrique Android

Le Club des Développeurs et IT Pro

Tutoriel sur la présentation du composant graphique « RecyclerView » sous Android,

Par Feanorin

Le 2015-06-21 13:36:10, par Feanorin, Expert éminent
Bonjour,

Vous trouverez ici Tutoriel sur la présentation du composant graphique « RecyclerView » sous Android.

Ce tutoriel va s'intéresser à un nouveau composant qui est le RecyclerView permettant d'afficher une liste d'articles dans un ensemble de sous-vues.
N'hésitez pas à réagir.

Bonne lecture.

Merci.
  Discussion forum
7 commentaires
  • grunk
    Modérateur
    Pour mémoire , l'affichage de liste d'articles sous Android se faisait via le composant ListView, GridView, etc. Ces composants avaient quelques ralentissements lorsque nous affichions leurs articles (items).
    Tu parles du cas où il sont implémenté sans ViewHolder ? Parce que avec un viewHolder j'ai jamais eu de problème de perf (bon j'ai pas non plus des liste de 10k éléments).

    Du peu que j'ai testé le RecyclerView semble bien pratique (enfin une liste horizontale !) mais un peu plus complexe à mettre en place.

    Par contre j'ai l'impression qu'on perd complètement la possibilité d'utiliser un CursorAdapter de base et qu'il faut passer par un tableau intermédiaire. Non ?

    Le lien vers le dépot github ne fonctionne pas
  • Feanorin
    Expert éminent
    Tu parles du cas où il sont implémenté sans ViewHolder ?
    Oui exactement . Le recyclerView oblige ce pattern.

    Par contre j'ai l'impression qu'on perd complètement la possibilité d'utiliser un CursorAdapter de base et qu'il faut passer par un tableau intermédiaire. Non ?
    Je n'ai pas vu son utilisation mais je pense qu'il y a moyen de créer son propre adapter en se basant sur le code du CursorAdapter, il faudrait regarder mais de base dans la SDK je n'ai rien vu.
  • MasterMbg
    Modérateur
    Bonjour Florian,

    Merci pour ce tutoriel. Il est bien expliqué et je ne peux que .

    Seulement, je n'arrive pas à m'en sortir alors que je reproduis exactement le même code (question de voir comment ça marche ) que tu mis dans le tuto. A chaque exécution j'ai l'erreur suivant :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    07-20 05:37:19.430  19448-19448/com.example.mastermbg.recycleview E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: com.example.chrislonembg.recycleview, PID: 19448
        java.lang.NullPointerException
                at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1694)
                at android.view.View.measure(View.java:16497)
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                at android.view.View.measure(View.java:16497)
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                at android.view.View.measure(View.java:16497)
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
                at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
                at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
                at android.view.View.measure(View.java:16497)
                at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
                at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
                at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
                at android.view.View.measure(View.java:16497)
                at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
                at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
                at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
                at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
                at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
                at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
                at android.view.Choreographer.doCallbacks(Choreographer.java:574)
                at android.view.Choreographer.doFrame(Choreographer.java:544)
                at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
                at android.os.Handler.handleCallback(Handler.java:733)
                at android.os.Handler.dispatchMessage(Handler.java:95)
                at android.os.Looper.loop(Looper.java:136)
                at android.app.ActivityThread.main(ActivityThread.java:5017)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:515)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                at dalvik.system.NativeStart.main(Native Method)
    Mon fichier grandle lui se présente comme suit :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 22
        buildToolsVersion "23.0.0 rc3"
    
        defaultConfig {
            applicationId "com.example.mastermbg.recycleview"
            minSdkVersion 9
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:22.2.0'
        compile 'com.android.support:recyclerview-v7:21.0.0'
    }
    J'exécute sur emulateur avec la version kitkat pour info.

    Pourrais tu m'aider à corriger cette erreur please?

    Merci d'avance.

    Christian,
  • Feanorin
    Expert éminent
    Salut,

    On dirait que ton problème provient d'un mauvais contexte passé à ton LinearLayoutManager si c'est celui là ?

    T'es tu basé sur le projet github ou bien à tu reconstruis le projet à partir des exemples ?
  • MasterMbg
    Modérateur
    Envoyé par Feanorin
    Salut,
    T'es tu basé sur le projet github ou bien à tu reconstruis le projet à partir des exemples ?
    Je ne me suis basé sur aucun projet, même pas construit le projet à partir des exemples.
    Je suis entrain de suivre ton tutoriel, j'ai créé un nouveau projet à partir de zéro, j'ai ajouter dans le gradle la ligne "compile 'com.android.support:recyclerview-v7'".
    Quand je synchronise le fichier gradle j'ai l'erreur suivante :
    Code :
    1
    2
    Error:Failed to resolve: com.android.support:recyclerview-v7:
    <a href="install.m2.repo">Install Repository and sync project</a><br><a href="openFile">Open File</a>
    Je ne sais plus quoi faire

    Christian,
  • IsiTech
    Membre actif
    Ça me parait bizarre de ne pas préciser la version dans la ligne compile, essai la ligne suivante :

    Code :
    compile 'com.android.support:recyclerview-v7:22.2.1'
    et vérifie dans le SDK Manager que tu as bien installé "Android Support Library" dans la partie "Extras" (La version indiquée est celle que tu dois utiliser dans la ligne "compile".

    J'ai crée une application utilisant les RecyclerView il y a quelques jours et aucun problème pour moi.
  • Feanorin
    Expert éminent
    Ça me parait bizarre de ne pas préciser la version dans la ligne compile
    Normalement il prend la dernière version.

    Il est préférable de mettre la version pour des problème de compatibilité entre lib.