meta data for this page

RecylerView et gestion des clics

Gestion d'un RecylerView dans un fragment et gestion des clics

Fragment

package ...
import...

public class LangAvailFragment extends ListFragment {

    private LangAvailViewModel homeViewModel;
    private TextView text_home;
    private List<Langue> LangueList;
    private RecyclerView recyclerView;
    private LangueRecyclerAdapter langueRecyclerAdapter;

    // Firebase
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference collectionReference = db.collection("Langue");

    public LangAvailFragment() {
    }

Déclaration de la vue, utilisation du layout fragmentlangavail

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_lang_avail, container, false);

  • Création d'un listener qui récupère les clics du recyclerview
  • On instancie l'interface RecyclerViewClickListener

        RecyclerViewClickListener listener = new RecyclerViewClickListener() {
            @Override
            // gestion du clic
            public void onClick(View v, Langue langue) {
                // ici on fait remonter l'info à l'activité principale en utilisant une interface
            }

            // gestion du menu contextuel Éditer
            public void onClickEdit (Langue langue){
                // ici on fait remonter l'info à l'activité principale en utilisant une interface
             }
           
            // gestion du menu contextuel Supprimer
            public void onClickDelete (Langue langue){
                // ici on supprime la sélection de la BD
            }
        };

        // langueList contient la liste des langues provenant de la BD
        // il faut ajouter du code pour récupérer cette liste
        LangueList = new ArrayList<>();
        recyclerView = (RecyclerView) view;
        final Context context = view.getContext();
        recyclerView.setLayoutManager(new LinearLayoutManager(context));

        // Instanciation du RecyclerAdapter en lui passant la liste de langue et l'interface listener
        langueRecyclerAdapter = new LangueRecyclerAdapter(LangueList, listener);
        recyclerView.setAdapter(langueRecyclerAdapter);
       
        return view;
    }

    // Interface pour récupérer les clics
    public interface RecyclerViewClickListener {
        void onClick(View view, Langue langue);
        void onClickEdit(Langue langue);
        void onClickDelete(Langue langue);
    }
}

RecyclerAdapter


import ...

public class LangueRecyclerAdapter extends RecyclerView.Adapter<LangueRecyclerAdapter.ViewHolder> {

    private final List<Langue> mLangues;
    private Context thiscontext;
    private LangAvailFragment.RecyclerViewClickListener mListener;

    public LangueRecyclerAdapter( List<Langue> mLangues, LangAvailFragment.RecyclerViewClickListener listener) {
        this.mLangues = mLangues;
        this.mListener = listener;
    }

    // Méthode qui permet de créer une ligne
    // utilisation du layout fragment_row
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.fragment_row, parent, false);
        this.thiscontext = parent.getContext();
        return new ViewHolder(view);
    }
    
    // Méthode qui remplit une ligne créée
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final Langue langue = mLangues.get(position);

        // Définit les valeurs dans les éléments graphiques
        // Les éléments graphiques sont définis dans la class ViewHolder à la fin du fichier
        holder.tv_name.setText(langue.getName());
        // Ajouter le code pour le pays et l'image
        ...


        // Gestion du clic pour ajouter une langue dans le fragment des langues sélectionnées
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != mListener) {
                    mListener.onClick(v, langue);
                }
            }
        });

        // Menu contextuel pour éditer ou supprimer
        holder.itemView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
            @Override
            // Création du menu contextuel
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                MenuItem edit = menu.add(0, v.getId(), 0, R.string.Modifier);
                MenuItem delete = menu.add(0, v.getId(), 0, R.string.Supprimer);

                // Gestion du bouton Modifier
                edit.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        mListener.onClickEdit(langue);
                        return false;
                    }
                });

                // Gestion du bouton Supprimer
                delete.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        mListener.onClickDelete(langue);
                        return false;
                    }
                });
            }
        });
    }

    // Méthode qui indique le nombre de ligne à créer
    @Override
    public int getItemCount() {
        return mLangues.size();
    }
    
    /**
     * Classe interne représentant les pointeurs vers les composants graphiques d'une ligne de la liste
     * Il y aura une instance de cette classe par ligne
     */
    public class ViewHolder extends RecyclerView.ViewHolder  {

        private TextView tv_name, tv_country;
        private ImageView iv_flag;
       
        private ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            tv_country = itemView.findViewById(R.id.tv_country);
            iv_flag = itemView.findViewById(R.id.iv_flag);
        }
    }
}