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

Le , par Feanorin, Responsable Android
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.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de grunk grunk - Modérateur https://www.developpez.com
le 26/06/2015 à 10:49
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
Avatar de Feanorin Feanorin - Responsable Android https://www.developpez.com
le 26/06/2015 à 22:29
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.
Avatar de MasterMbg MasterMbg - Modérateur https://www.developpez.com
le 20/07/2015 à 11:40
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 : Sélectionner tout
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 : Sélectionner tout
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,
Avatar de Feanorin Feanorin - Responsable Android https://www.developpez.com
le 25/07/2015 à 18:17
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 ?
Avatar de MasterMbg MasterMbg - Modérateur https://www.developpez.com
le 25/07/2015 à 18:34
Citation Envoyé par Feanorin  Voir le message
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 : Sélectionner tout
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,
Avatar de IsiTech IsiTech - Membre actif https://www.developpez.com
le 25/07/2015 à 20:53
Ça me parait bizarre de ne pas préciser la version dans la ligne compile, essai la ligne suivante :

Code : Sélectionner tout
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.
Avatar de Feanorin Feanorin - Responsable Android https://www.developpez.com
le 01/09/2015 à 13:04
Ç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.
Offres d'emploi IT
Développeur Back-End
Maestro Corp. - Midi Pyrénées - Toulouse (31000)
Développeur Backend
Adveez - Midi Pyrénées - Toulouse (31000)
Développeur Web H/F
CTAC-TECH - Midi Pyrénées - Toulouse (31000)

Voir plus d'offres Voir la carte des offres IT
Responsable bénévole de la rubrique Android : Feanorin -