Je vais poser une question très basique, mais je suis coincé dedans pendant longtemps.
après l'affichage de la carte, il y a un recycleview qui a 2 images dans chaque ligne. Maintenant, je veux créer l'auditeur de clic sur les images plutôt que le recycleview.
la mise en page correspondante (layout_main.xml) de cette activité (MainActivity.Java) ne contient que recyclerview. les éléments de chaque ligne sont dans une autre disposition (layout_images.xml). Je reçois les images de layout_images.xml et les gonfle dans la classe d'adaptateur (Adapter.Java).
maintenant, comment mettre action auditeur sur les images uniquement.
deuxièmement, je veux obtenir l'image sur laquelle j'ai cliqué. comment obtenir cela. comme quand on clique sur une vue on crée une méthode
public void onClick(View view){
// some code here
}
où view est l'objet sur lequel nous avons cliqué. dans mon cas, comment obtenir l'image sur laquelle j'ai cliqué. en utilisant le transtypage, il se peut qu'il lève une exception lorsque l'utilisateur ne clique pas sur l'image.
Plusieurs événements onClick dans un recyclerView:
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{
public ImageView iconImageView;
public TextView iconTextView;
public MyViewHolder(final View itemView) {
super(itemView);
iconImageView = (ImageView) itemView.findViewById(R.id.myRecyclerImageView);
iconTextView = (TextView) itemView.findViewById(R.id.myRecyclerTextView);
// set click event
itemView.setOnClickListener(this);
iconTextView.setOnClickListener(this);
// set long click event
iconImageView.setOnLongClickListener(this);
}
// onClick Listener for view
@Override
public void onClick(View v) {
if (v.getId() == iconTextView.getId()){
Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
}
}
//onLongClickListener for view
@Override
public boolean onLongClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
builder.setTitle ("Hello Dialog")
.setMessage ("LONG CLICK DIALOG WINDOW FOR ICON " + String.valueOf(getAdapterPosition()))
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.create().show();
return true;
}
}
Pour obtenir sur quel élément vous avez cliqué, vous faites correspondre l'identifiant de la vue, à savoir v.getId () == yourViewItem.getId ()
vous devez définir onclicklistener
sur imageview
s dans la méthode onBindViewHolder
, reportez-vous aux LDC suivants pour référence (le code doit être dans la méthode onBindViewHolder
)
holder.imageView1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//put your code for first imageview here
}
holder.imageView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//put your code for second imageView here
}
implémentez le View.OnClickListener
dans votre classe ViewHolder
et implémentez la méthode onClick
. Définissez ensuite l’auditeur de clic de votre ImageView sur cet écouteur de clic. Ajoutez la fonctionnalité requise dans la méthode onClick. Si vous souhaitez implémenter la fonctionnalité de clic dans une autre classe, créez simplement une interface et déclarez une méthode de clic dans celle-ci. Vous pouvez implémenter cette méthode dans l'activité/le fragment qui contient ce RecycleView. Ensuite, à partir de la méthode onClick de vos détenteurs de vue, vous pouvez appeler la méthode d'interface.
In Recycle View Holder , Écrivez votre code d'auditeur onclick à l'intérieur.
@Override
public void onBindViewHolder(CardHolder holder, final int position) {
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//TODO
}
}
}
Vous pouvez vérifier avec tag ou il d'élément comme ceci:
public void onClick(View view){
if(view.getId() == image1.getId())
{
}else if(view.getId() == image2.getId())
{}
}
Tout d’abord, définissez onclickListener sur chaque vue sur laquelle vous souhaitez cliquer. Bon endroit pour le faire dans viewHolderConstructor. par exemple
public class GalleryManyViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.im_img) RoundedCornersImageView imImg;
@BindView(R.id.tv_title) MyTextView tvTitle;
@BindView(R.id.tv_label) MyTextView tvLabel;
@BindView(R.id.tv_date) MyTextView tvDate;
@BindView(R.id.im_gallery_one) RoundedCornersImageView imGalleryOne;
@BindView(R.id.im_gallery_two) RoundedCornersImageView imGalleryTwo;
@BindView(R.id.im_gallery_three) RoundedCornersImageView imGalleryThree;
@BindView(R.id.im_gallery_four) RoundedCornersImageView imGalleryFour;
@BindView(R.id.tv_more) MyTextView tvMore;
@BindView(R.id.root) RelativeLayout root;
public GalleryManyViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
view.setOnClickListener(onClickListener);
imGalleryOne.setOnClickListener(onClickListener);
imGalleryTwo.setOnClickListener(onClickListener);
imGalleryThree.setOnClickListener(onClickListener);
imGalleryFour.setOnClickListener(onClickListener);
view.setTag(this);
}
En général, vous n'avez pas besoin de créer quoi que ce soit de spécifique avec cette vue, comme la définition de balises (Certaines bibliothèques utiles comme Glied, qui définit ses propres balises sur images, ne fonctionneront pas correctement si vous définissez votre propre balise. Dans clickListener, positionnez l'adaptateur sur la être capable de récupérer les données correspondantes
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override public void onClick(View v) {
View view = v;
View parent = (View) v.getParent();
while (!(parent instanceof RecyclerView)){
view=parent;
parent = (View) parent.getParent();
}
int position = recyclerView.getChildAdapterPosition(view);
}
comme décrit ici Puis, en vérifiant les vues, identifiez ce que vous voulez faire.
switch (v.getId()) {
case R.id.im_gallery_one: {
p = 0;
}
break;
case R.id.im_gallery_two: {
p = 1;
}
break;
case R.id.im_gallery_three: {
p = 2;
}
break;
case R.id.im_gallery_four: {
p = 3;
}
break;
}