Est-ce que quelqu'un qui utilise RecyclerView
a trouvé un moyen de définir un onClickListener
pour les éléments dans le RecyclerView
?
J'ai pensé à définir un écouteur pour chacune des mises en page de chaque élément, mais cela semble un peu trop compliqué.
Je suis sûr qu'il y a un moyen pour le RecyclerView
d'écouter l'événement onClick
mais je n'arrive pas à le comprendre.
Comme les API ont radicalement changé, je ne serais pas surpris si vous deviez créer un OnClickListener
pour chaque élément. Mais ce n'est pas si compliqué que ça. Dans votre implémentation de RecyclerView.Adapter<MyViewHolder>
, vous devriez avoir :
private final OnClickListener mOnClickListener = new MyOnClickListener();
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
view.setOnClickListener(mOnClickListener);
return new MyViewHolder(view);
}
La méthode onClick
:
@Override
public void onClick(final View view) {
int itemPosition = mRecyclerView.getChildLayoutPosition(view);
String item = mList.get(itemPosition);
Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
Consultez une [question][1] similaire. Le commentaire de @CommonsWare's renvoie à [this][2], qui implémente l'interface OnClickListener
dans le viewHolder
.
Voici un exemple simple de l'interface ViewHolder
:
TextView textView;//declare global with in adapter class
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textView = (TextView)view.findViewById(android.R.id.text1);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "position = " + getLayoutPosition(), Toast.LENGTH_SHORT).show();
//go through each item if you have few items within recycler view
if(getLayoutPosition()==0){
//Do whatever you want here
}else if(getLayoutPosition()==1){
//Do whatever you want here
}else if(getLayoutPosition()==2){
}else if(getLayoutPosition()==3){
}else if(getLayoutPosition()==4){
}else if(getLayoutPosition()==5){
}
//or you can use For loop if you have long list of items. Use its length or size of the list as
for(int i = 0; i<exampleList.size(); i++){
}
}
}
L'adaptateur ressemble alors à ceci :
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view =LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(view);
}
[1] : https://stackoverflow.com/questions/24562744/challenges-in-recyclerview-of-android-l [2] : https://gist.github.com/grantland/cd70814fe4ac369e3e92
Voici ce dont j'ai fini par avoir besoin, au cas où quelqu'un trouverait cela utile :
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View item) {
super(item);
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("RecyclerView", "onClick:" + getAdapterPosition());
}
});
}
}
Source : http://blog.csdn.net/jwzhangjie/article/details/36868515