IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Envoyer données dans un recyclerview vers Activité (avec curseur)


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut Envoyer données dans un recyclerview vers Activité (avec curseur)
    Bonjour, j'ai une application qui possède un recyclerView contenant des données provenant de ma base SQLite. Je les récupère avec un curseur. J'aimerai savoir comment je peux les envoyer vers la nouvelle activité lorsque je clique sur un item du recyclerView.

    J'ai tenté quelque chose mais il me renvoi une erreur qui est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FATAL EXCEPTION: main Process: morpheus.oniri, PID: 6696 java.lang.RuntimeException: Unable to start activity ComponentInfo{morpheus.oniri/morpheus.oniri.activities.afficherCarnetActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference at morpheus.oniri.activities.afficherCarnetActivity.getAllData(afficherCarnetActivity.java:113) at morpheus.oniri.activities.afficherCarnetActivity.onCreate(afficherCarnetActivity.java:107) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  at android.app.ActivityThread.access$800(ActivityThread.java:151)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    J'ai effectué ceci pour récupérer les données sur ma nouvelle activité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Intent i = getIntent();
    Carnet carnetP;
    carnetP = i.getParcelableExtra("data");
    notes = carnetP.getText();
    Et pour les envoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public GroceryViewHolder(final View itemView) {
        super(itemView);
        dateItem = itemView.findViewById(R.id.date_item);
        colorItem = itemView.findViewById(R.id.color_item);
        textItem = itemView.findViewById(R.id.text_item);
        lucidItem = itemView.findViewById(R.id.lucid_item);
     
     
        itemView.setOnClickListener(this); //my itemView clik
    }
     
     
    @Override
    public void onClick(View v) {
        int pos = getAdapterPosition();
        if(pos != RecyclerView.NO_POSITION){
            Intent intent = new Intent(mContext, afficherCarnetActivity.class);
            intent.putExtra("data", new Carnet());
            mContext.startActivity(intent);
        }
    Quand je fais un Log.d() je vois bien que la variable note est null mais quand je fais le log.d() sur mon "carnetP" j'obtiens un texte qui ressemble au chemin du package vers mon modele : "morpheus.oniri.model.Carnet@14dbb242". Ce n'est pas ce qui est dans ma base de données.

    Mon modèle de données qui implémente "Parcelable" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    public class Carnet implements Parcelable {
     
        public Carnet(){
     
        }
     
        private int id;
        private String text;
        private String userId;
        private int color;
        private String method;
        private String date;
        private int lucid;
     
     
        protected Carnet(Parcel in) {
            id = in.readInt();
            text = in.readString();
            userId = in.readString();
            color = in.readInt();
            method = in.readString();
            date = in.readString();
            lucid = in.readInt();
        }
     
        public static final Creator<Carnet> CREATOR = new Creator<Carnet>() {
            @Override
            public Carnet createFromParcel(Parcel in) {
                return new Carnet(in);
            }
     
            @Override
            public Carnet[] newArray(int size) {
                return new Carnet[size];
            }
        };
     
        public int getId(){
            return id;
        }
     
        public void setId(int id){
            this.id = id;
        }
     
        public String getText(){
            return text;
        }
     
        public void setText(String text){
            this.text = text;
        }
     
        public int getLucid(){
            return lucid;
        }
     
        public void setLucid(int lucid){
            this.lucid = lucid;
        }
     
        public void setMethod(String method){
            this.method = method;
        }
     
        public String getMethod(){
            return method;
        }
     
        public void setDate(String date){
            this.date = date;
        }
     
        public String getDate(){
            return date;
        }
     
        public void setColor(int color){
            this.color = color;
        }
     
        public  int getColor(){
            return color;
        }
     
        @Override
        public int describeContents() {
            return 0;
        }
     
     
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(id);
            dest.writeString(text);
            dest.writeString(userId);
            dest.writeInt(color);
            dest.writeString(method);
            dest.writeString(date);
            dest.writeInt(lucid);
        }
    }
    Auriez vous une idée du problème ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Salut,

    ce qui t'arrive est normal. Au clic, tu envoies une nouvelle instance d'un objet Carnet en appelant ce constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public Carnet(){
     
        }
    donc sans aucun contenu. Le "text" de ce carnet n'est jamais initialisé.

    Si ta liste est bien affichée, tu as juste un p'tit truc à changer. Dans le onClick de ton ViewHolder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void onClick(View v) {
        int pos = getAdapterPosition();
        if(pos != RecyclerView.NO_POSITION){
            Intent intent = new Intent(mContext, afficherCarnetActivity.class);
            intent.putExtra("data", maListe.get(pos));
            mContext.startActivity(intent);
        }
    où maListe est ta liste de Carnet que tu affiches avec ta recyclerview et que t'as du faire passer par un quelconque moyen dans ton adapter

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut
    Citation Envoyé par Turvy Voir le message
    Salut,

    ce qui t'arrive est normal. Au clic, tu envoies une nouvelle instance d'un objet Carnet en appelant ce constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     public Carnet(){
     
        }
    donc sans aucun contenu. Le "text" de ce carnet n'est jamais initialisé.

    Si ta liste est bien affichée, tu as juste un p'tit truc à changer. Dans le onClick de ton ViewHolder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void onClick(View v) {
        int pos = getAdapterPosition();
        if(pos != RecyclerView.NO_POSITION){
            Intent intent = new Intent(mContext, afficherCarnetActivity.class);
            intent.putExtra("data", maListe.get(pos));
            mContext.startActivity(intent);
        }
    où maListe est ta liste de Carnet que tu affiches avec ta recyclerview et que t'as du faire passer par un quelconque moyen dans ton adapter

    Hmm d'accord je vois.
    Dans le putExtra, je n'arrive pas récupérer les items...

    Ma liste je la récupère dans le onBindViewHolder() de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public void onBindViewHolder(@NonNull GroceryViewHolder holder, int position) {
            if(!mCursor.moveToPosition(position)){
                return;
            }
            final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
            String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
            int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
            String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
            int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));
     
            holder.dateItem.setText(date);
            holder.colorItem.setBackgroundColor(color);
            holder.textItem.setText(text);
            holder.itemView.setTag(id);
     
            if(lucide == 1){
                holder.lucidItem.setVisibility(View.VISIBLE);
            }
        }
    Ensuite quand j'initialise mon adapter, je passe en paramètre ma méthode de récupération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            mAdapter = new GroceryAdapter(this, carnetDAO.getAllNote());
            recyclerView.setAdapter(mAdapter);

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Parser ton cursor dans le onBindViewHolder ne me semble pas une bonne pratique. Ce que l'on y fait en général est de récupérer les données de chaque composant pour les afficher dans les items de la recyclerview.

    Ce que je te conseille : tu crées ta liste de Carnet dans l'activité via ton cursor, puis tu passes cette liste dans l'adapter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mAdapter = new GroceryAdapter(this, maListe);
    Bien entendu, tu modifies un peu le constructeur. Ainsi, tu as acces à ta liste dans tout ton adapter

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 6
    Par défaut
    Citation Envoyé par Turvy Voir le message
    Parser ton cursor dans le onBindViewHolder ne me semble pas une bonne pratique. Ce que l'on y fait en général est de récupérer les données de chaque composant pour les afficher dans les items de la recyclerview.

    Ce que je te conseille : tu crées ta liste de Carnet dans l'activité via ton cursor, puis tu passes cette liste dans l'adapter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mAdapter = new GroceryAdapter(this, maListe);
    Bien entendu, tu modifies un peu le constructeur. Ainsi, tu as acces à ta liste dans tout ton adapter
    J'ai finalement résolu le problème. J'ai créé une liste dans laquelle j'ai passé mes différentes valeurs que j'avais initialisé avec les cursor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
            final int id = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.ID_CARNET));
            String text = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.TEXTE_CARNET));
            int color = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.COULEUR_CARNET));
            String date = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.DATE_CARNET));
            int lucide = mCursor.getInt(mCursor.getColumnIndex(CarnetDAO.LUCIDITE_CARNET));
            String method = mCursor.getString(mCursor.getColumnIndex(CarnetDAO.METHODE_CARNET));
     
            holder.dateItem.setText(date);
            holder.colorItem.setBackgroundColor(color);
            holder.textItem.setText(text);
            holder.itemView.setTag(id);
     
            Carnet carnet = new Carnet();
            carnet.setId(id);
            carnet.setText(text);
            carnet.setColor(color);
            carnet.setDate(date);
            carnet.setLucid(lucide);
            carnet.setMethod(method);
            mListCarnet.add(carnet);
    Et j'ai réalisé un putExtra sur cette liste en la castant sur un Parcelable et cela fonctionne
    Merci pour l'aide en tout cas !

Discussions similaires

  1. [MySQL] Probleme pour envoyer données d'un formulaire vers MYSQL
    Par lol88 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/01/2010, 16h45
  2. [XL-2003] Données dans fichier .txt vers tableau en .xls
    Par Invité1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/08/2009, 19h30
  3. Réponses: 0
    Dernier message: 27/12/2008, 16h35
  4. Envoyer des variables de Flash vers PHP avec GET
    Par Gizmil dans le forum Dynamique
    Réponses: 1
    Dernier message: 19/11/2007, 00h52
  5. Pb de lecture données dans une plage de cellule avec itération
    Par rond24 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/07/2006, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo