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); } } }