Comment ajouter OnClickListner à CardView?
Je suis en train de travailler avec RecyclerView
et CardView
. Je veux joindre OnClickListner
à chaque carte. J'ai essayé avec de nombreuses réponses disponibles sur stackoverflow, mais ils ne sont pas de travail pour moi. Jusqu'à présent j'ai essayé -
public class SubjectAdapter extends RecyclerView.Adapter<SubjectAdapter.ViewHolder> implements View.OnClickListener,
View.OnLongClickListener{
private static final String LOGCAT = "SubjectAdapter";
private final Context mContext;
List<Subject> SubjectsList;
public SubjectAdapter(Context context) {
super();
this.mContext = context;
SQLiteDatabase.loadLibs(mContext);
DBHelper myDbHelper = new DBHelper(mContext);
SubjectsList = new ArrayList<Subject>();
SubjectsList = myDbHelper.getAllSubjects();
myDbHelper.close();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.subject_cardview_row, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
//Below two lines are NOT working
viewHolder.tvSubjectName.setOnClickListener(this);
//viewHolder.setOnClickListener(this);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Subject subject = SubjectsList.get(i);
viewHolder.tvSubjectName.setText(subject.getSubject_Name());
viewHolder.tvCounts.setText(String.valueOf(subject.getSubject_Number_of_Questions()));
//Below two lines are NOT working
viewHolder.tvSubjectName.setOnClickListener(this);
//viewHolder.setOnClickListener(this);
}
@Override
public int getItemCount() {
return SubjectsList.size();
}
@Override
public void onClick(View v) {
//It's not working either
ViewHolder holder = (ViewHolder) v.getTag();
int position = holder.getPosition();
if (v.getId() == holder.tvSubjectName.getId()){
Log.d(LOGCAT, "tvSubjectName onClick at" + position);
//Toast.makeText(mContext, "tvSubjectName onClick at" + position, Toast.LENGTH_LONG).show();
} else {
Log.d(LOGCAT, "RecyclerView Item onClick at " + position);
//Toast.makeText(mContext, "RecyclerView Item onClick at " + position, Toast.LENGTH_LONG).show();
}
}
@Override
public boolean onLongClick(View v) {
return false;
}
class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvSubjectName;
public TextView tvCounts;
public ViewHolder(View itemView) {
super(itemView);
tvSubjectName = (TextView) itemView.findViewById(R.id.tv_subject_name);
tvCounts = (TextView) itemView.findViewById(R.id.tv_text_counts);
}
}
}
Comme on peut le voir, j'ai essayé setOnClickListener
avec les deux onCreateViewHolder
et onBindViewHolder
, aussi distinct onClick
, mais aucune ne semble fonctionner pour moi. Donc, je veux savoir, Comment ajouter OnClickListner à CardView?
pouvez-vous fournir votre code XML fichier de mise en page ?
OriginalL'auteur Dr. Atul Tiwari | 2015-05-09
Vous devez vous connecter pour publier un commentaire.
Vue retourné par onClick ne correspondent pas forcément à la Vue ligne de la hiérarchie de l'recycleur de vue.
Je pense que vous devriez modifier
onBindViewHolder
avecSi vous utilisez long puis cliquez sur remplacer
View.OnClickListener
avecView.OnLongClickListener
etonClick
aveconLongClick
.OnClickListener
mais montre l'erreur pourOnLongClickListener
. Aussi, je pense que vous vouliez direView.OnClickListener
, dans votre exemple de code. Je vais marquer meilleure réponse, dès que j'ai de travailler pourOnLongClickListener
trop. merci. upvote de moi.2. aussi, est-il de toute façon par laquelle quelque chose comme ceci peut être réalisé -
viewHolder.setOnClickListener
?Je l'ai eu, maintenant, vous mélangé
onClickLinstner
(ce qui nécessitesetOnClickListener
) etonLongClickListner
.(ce qui nécessitesetOnLongClickListener
). Votre suggestion fonctionne après correction. Veuillez les corriger. Mais je ne pouvais pas trouver un moyen d'obtenir directement desviewHolder.setOnClickListener
, autres que l'aideonClickListner
à toute la mise en page. Merci.Wah, vous avez modifié dans le même temps, alors que je le disais la même chose dans les commentaires. 😛
Eh bien je vous remercie. Pour répondre à votre#2 oui, vous pouvez. Si vous avez l'id de la racine de votre ligne
R.layout.subject_cardview_row
qui je suppose est CardView, alors vous pouvez obtenir la référence dansViewHolder
de la même manière que vous avez faitTextView tvSubjectName, tvCounts
. Ensuite, vous pouvez connecter un écouteur de clics.OriginalL'auteur inmyth
Cela a fonctionné pour moi !
Mettre le setOnClickListener-méthode à l'intérieur du constructeur de votre ViewHolder classe.
}
ViewHolder holder = (ViewHolder) v.getTag(); int position = holder.getPosition();
aussi, même si d'une certaine façon j'ai pu obtenir la position, je n'aurais pas d'infos supplémentaires, je suis en mesure d'obtenir à partir de @inmyth réponse (int i, dans sa réponse). Upvote de moi.ok, je l'ai eu. Je vais essayer avec entier, mais même alors, je ne voudrais Pas être en mesure d'obtenir des infos supplémentaires, comme
subject.getSubject_Name()
qui est enonBindViewHolder
ou est-il un moyen de contourner?Essayez d'utiliser v. findViewById() à l'intérieur de la onClick et utiliser le TextView obtenir les informations supplémentaires que vous souhaitez. Je pense qu'il y a de meilleures façons d'obtenir de l'information supplémentaire, mais ce est celui que vous pouvez essayer.
Hey, merci pour votre soutien continu, mais j'ai obtenu tout ce dont j'avais besoin, de modifier @inmyth de réponse (je suis en commentant lui un tre dans sa réponse). Souhaite que je pourrais vote double vous pour votre aide 🙂
La méthode @inmyth utilise est le même que moi, le code est seulement situé sur un endroit différent.
OriginalL'auteur Nike Sprite
Découvrez Lucas Rocha nouveau TwoWayView API.
Suivez son site et la mise en œuvre de l'API est relativement simple et peut vous aider à travers les difficiles complexités RecyclerView et CardView pose.
http://lucasr.org/2014/07/31/the-new-twowayview/
OriginalL'auteur AlleyOOP
Ensemble OnClickListener à itemView dans RecyclerView.ViewHolder constructeur, vous pouvez également en position d'extraction de cardView à l'aide de
getAdapterPosition()
méthode qui peut vous aider à transmettre les données d'une nouvelle activité à l'aide de putExtra méthode d'intention. doc pour getAdapterPosition méthode`
`
OriginalL'auteur Nagesh Dhope
Si vous voulez vraiment mettre en œuvre onclick auditeur puis effectuez les opérations suivantes
2.setOnClickListener à la vue de l'objet que vous avez déclarée(en ViewHolder) onBindViewHolder dans la classe d'Adaptateur
cela fonctionne pour l'ensemble de la cardView
OriginalL'auteur Sanga Krish