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

Android Discussion :

Comment afficher une vue vide avec une RecyclerView lorsque suprime tou ses elements


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 74
    Par défaut Comment afficher une vue vide avec une RecyclerView lorsque suprime tou ses elements
    Bonjour, espérant que vous allez bien

    J'ai un fragment qui affiche un recycler view (les éléments sont retirés d'une base de données SQLITE), dans cette liste l'utilisateur a la possibilité de retirer (supprimer) un élément de la liste.
    Ce que je veux faire c'est que lorsque l'utilisateur supprime tous les éléments, j'affiche une image ou bien un texte view indiquant que la liste est vide.

    Voilà le code du RecyclerView
    Cette condition en dessous, dans la méthode on click() permet seulement de vérifier si un élément existe dans la base de données "favorite" avant de l'ajouter
    MajdoubeDAO.CheckIsDataAlreadyInDBorNot(favorites.get(mIndex).getId_poetry())
    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    import android.animation.ArgbEvaluator;
    import android.animation.ValueAnimator;
    import android.content.Context;
    import android.graphics.Color;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
     
    import android.widget.TextView;
    import android.widget.Toast;
     
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
     
    import com.example.majdoub_roubayette.Contrellers.fragment.PreferedFragment;
    import com.example.majdoub_roubayette.Models.MajdoubeDAO;
    import com.example.majdoub_roubayette.Models.beans.Poetry;
    import com.example.majdoub_roubayette.R;
     
    import java.util.ArrayList;
     
    import static androidx.constraintlayout.widget.Constraints.TAG;
     
    public class FavoriteAdapter extends RecyclerView.Adapter {
     
        ArrayList<Poetry> favorites;
        Context context;
        private final PreferedFragment.OnPoetryFavItemSelectedInterface mListner;
     
        //Color
        int whiteColor = Color.rgb(255, 255, 255);
        int yellowColor = Color.rgb(255, 239, 59);
     
     
     
        public FavoriteAdapter(Context context, ArrayList<Poetry> poetryArrayListStar, PreferedFragment.OnPoetryFavItemSelectedInterface mListner) {
            this.context = context;
            this.favorites = poetryArrayListStar;
            this.mListner = mListner;
        }
     
     
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
     
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_view, parent, false);
            return new ListViewHolder(view);
     
        }
     
        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
     
            ((ListViewHolder) holder).bindView(position);
        }
     
        @Override
        public int getItemCount() {
            if (favorites == null) {
                return 0;
            } else {
                return favorites.size();
            }
        }
     
     
        private class ListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
     
            TextView line1, line2, line3, line4;
            LinearLayout roubayeteHeader;
            ImageView startButton, shareButton, copyButton;
            private int mIndex;
     
     
            public ListViewHolder(@NonNull View itemView) {
                super(itemView);
     
                roubayeteHeader = itemView.findViewById(R.id.roubayeteHeader);
                startButton = itemView.findViewById(R.id.startButton);
                shareButton = itemView.findViewById(R.id.shareButton);
                copyButton = itemView.findViewById(R.id.copyButton);
                line1 = itemView.findViewById(R.id.line1);
                line2 = itemView.findViewById(R.id.line2);
                line3 = itemView.findViewById(R.id.line3);
                line4 = itemView.findViewById(R.id.line4);
     
     
                roubayeteHeader.setOnClickListener(this);
                startButton.setOnClickListener(this);
                shareButton.setOnClickListener(this);
                copyButton.setOnClickListener(this);
            }
     
            public void bindView(int position) {
     
                line1.setText(favorites.get(position).getLine1_poetry());
                line2.setText(favorites.get(position).getLine2_poetry());
                line3.setText(favorites.get(position).getLine3_poetry());
                line4.setText(favorites.get(position).getLine4_poetry());
     
                //pour changer la couleur de l'icon star en jaune
                if (MajdoubeDAO.CheckIsDataAlreadyInDBorNot(favorites.get(position).getId_poetry())) {
                    startButton.setColorFilter(yellowColor);
                    Log.i(TAG, "LisViewHolder: Add to favorite " + mIndex);
                } else {
                    startButton.setColorFilter(whiteColor);
                    Log.i(TAG, "LisViewHolder: Removed from favorite " + mIndex);
                }
     
                mIndex = position;
     
            }
     
            public void onClick(View view) {
                int id = view.getId();
     
                if (id == roubayeteHeader.getId()) {
                    Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
                    mListner.onListPoetrySelected(mIndex);
     
                } else if (id == startButton.getId()) {
     
     
                    if (MajdoubeDAO.CheckIsDataAlreadyInDBorNot(favorites.get(mIndex).getId_poetry())) {
                        Toast.makeText(context, "Removed From Stars", Toast.LENGTH_SHORT).show();
                        startButton.setColorFilter(whiteColor);
                        MajdoubeDAO.removeFromFavorite(favorites.get(mIndex).getId_poetry());
                        favorites.remove(mIndex);
                        notifyItemRemoved(mIndex);
                        notifyItemRangeChanged(mIndex, favorites.size());
     
     
                    } else {
                        Toast.makeText(context, "Added To Favorite", Toast.LENGTH_SHORT).show();
                        startButton.setColorFilter(yellowColor);
                        MajdoubeDAO.insertToFavorite(favorites.get(mIndex).getId_poetry());
                    }
     
                } else if (id == shareButton.getId()) {
                    Toast.makeText(context, "share", Toast.LENGTH_SHORT).show();
     
                } else if (id == copyButton.getId()) {
                    Toast.makeText(context, "Text Copied", Toast.LENGTH_SHORT).show();
     
                }
            }
     
        }
     
    }

    Ce Code c'est Pour recyclerView Layout "prefered_fragment.xml"

    Code XML : 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
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Contrellers.fragment.PreferedFragment">
     
        <androidx.recyclerview.widget.RecyclerView
            android:visibility="visible"
            android:id="@+id/PoetryFavoritelistRecyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            android:paddingTop="25dp" />
     
     
    <RelativeLayout
        android:visibility="gone"
        android:id="@+id/noData"
        android:layout_gravity="center"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
     
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25sp"
            android:text="NO DATA"/>
     
    </RelativeLayout>
     
    </FrameLayout>

    et ce dernier c'est pour le fragment "PreferedFragment "

    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
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.RelativeLayout;
    import android.widget.Toast;
     
    import androidx.annotation.NonNull;
    import androidx.fragment.app.Fragment;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
     
    import com.example.majdoub_roubayette.Adapter.FavoriteAdapter;
    import com.example.majdoub_roubayette.Models.MajdoubeDAO;
    import com.example.majdoub_roubayette.Models.beans.Poetry;
    import com.example.majdoub_roubayette.R;
     
    import java.util.ArrayList;
     
    /**
     * A simple {@link Fragment} subclass.
     */
    public class PreferedFragment extends Fragment {
     
        RelativeLayout noData;
        RecyclerView recyclerView;
        int index;
        private ArrayList<Poetry> poetryArrayListStar;
     
        public static PreferedFragment newInstance() {
            return (new PreferedFragment());
        }
     
     
        public interface OnPoetryFavItemSelectedInterface {
     
            void onListPoetrySelected(int index);
        }
     
     
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
     
     
            OnPoetryFavItemSelectedInterface mListner = (OnPoetryFavItemSelectedInterface) getActivity();
     
     
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.prefered_fragment, container, false);
     
            noData = view.findViewById(R.id.noData);
     
     
            poetryArrayListStar = MajdoubeDAO.getFavorites();
     
            recyclerView = view.findViewById(R.id.PoetryFavoritelistRecyclerView);
     
     
            FavoriteAdapter favoriteAdapter = new FavoriteAdapter(getContext(), poetryArrayListStar, mListner);
            recyclerView.setAdapter(favoriteAdapter);
            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(layoutManager);
     
     
            return view;
        }
     
     
        @Override
        public void onSaveInstanceState(@NonNull Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt("INDEX", index);
        }
     
        @Override
        public void onResume() {
            super.onResume();
            if (poetryArrayListStar.isEmpty()) {
                //noData=view.findViewById(R.id.noData);
                recyclerView.setVisibility(View.GONE);
                noData.setVisibility(View.VISIBLE);
                Toast.makeText(getActivity(), "no data", Toast.LENGTH_SHORT).show();
            }
     
        }
    }
    Le code dans onResume () permet de tester si la liste des favoris est vide, si c'est le cas j'affiche le texte indiquant que la liste est vide ; mais le problème c'est que le texte s'affiche dés que je quitte l'application vais vers MainActivity et après retourne vers ce fragment dans ce cas le texte s'affiche bien ==> n'est pas immédiat.

    Ce que je veux réaliser, c'est lorsqu'on supprime tous les éléments on affiche la vue vide immediatly.

    Merci, en attendant avec impatience.

    Nom : tempsnip.png
Affichages : 533
Taille : 37,9 Ko

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Salut
    -----

    J'ai une application qui fait ça sous réserve que j'aie bien compris: Récupération des logs des threads avec possibilité pour l'utilisateur d'effacer les logs, auquel cas le recyclerView affiche un élément "factice" qui indique "Liste vide".
    J'ai utilisé une LiveData dans le viewModel, qui, lui, observe le résultat de retour de la base de données via Room.

    Il suffit alors à l'activité de s'abonner à la LiveData, et en cas de modification de reporter les changements à l'adapter du recyclerView.

    Si tu veux te passer du ViewModel tu peux t'abonner directement au résultat de retour de ta SQLITE via la valeur de retour "LiveData" de ta requête Room.

    Il suffit alors si la liste reçue de la BDD est vide, d'envoyer un élément factice "vide" à l'adaptateur de ta RecyclerView.

    Bref: BDD SQLITE -> REQUEST ROOM = LiveDATA ->Observée par l'activité->Modification reportée->Mettre à jour les éléments gérés par l'Adapter et si vide lui fournir un élément vide

    De la sorte tout est évènementiel, aucune requête explicite à effectuer sauf la première pour obtenir la LiveData, et toute modification opérée sur la BDD depuis n'importe où se répercute instantanément sur le RecyclerView, avec gestion simple de la liste vide.

    Et si tu passes par un ViewModel, c'est lui qui observe la BDD et fournit la LiveData observée par l'activité

    J'espère que c'est assez clair

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 74
    Par défaut
    Salut "ClaudeBg" ;


    Un peu tard , mais permettez-moi de vous dire merci beaucoup , oui c'est clair, using view-model with room

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Par défaut
    Pour répondre également à la question, je voudrais proposer une solution alternative que l'on peut voir dans de nombreuses applications. Lorsque que le RecyclerView sera vide, il affichera le contenu désiré, sans être contraint par un item vide ou un item par défaut dans le RecyclerView.

    Dans le .XML contenant le RecyclerView, il suffit créer une vue contenant les éléments désirés si le RecyclerView est vide, par dessus le RecyclerView et mettre cette vue en Dans le code Java ou Kotlin, lorsque l'on regarde les données à mettre dans l'adapter du RecyclerView, si ces dernières sont vides, on passe notre vue superposée en et le RecyclerView en .

    De cette manière, on peut vraiment afficher tout ce que l'on veut lorsqu'il n'y a pas de données à afficher.

    Comme dit précédemment, afin de vérifier "en temps réel" si il y a des données à afficher ou pas on s'abonne à un LiveData. En revanche, il est déconseillé de lire un LiveData depuis un viewModel. On va préférer le lire différemment dans le viewModel puis créer un LiveData qui sera lu depuis les Activity ou les Fragments.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/05/2009, 00h16
  2. comment afficher une image avec j2me
    Par jenimed dans le forum Java ME
    Réponses: 2
    Dernier message: 16/05/2009, 20h07
  3. Réponses: 5
    Dernier message: 12/03/2009, 11h54
  4. Comment afficher une valeur dans un edittext avec un autre programme
    Par pitizone dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 14/05/2007, 07h45
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 09h28

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