web-dev-qa-db-fra.com

Définition d'un onCLickListener d'un RecyclerView dans une activité

RecyclerView est différent d'un ListView car il ne propose pas de classe onItemCLickListener pour gérer les événements de clic.

Vous pouvez résoudre ce problème si peu de choses se passent en coulisse lorsqu'un élément est cliqué, en définissant un onClickListener dans le ViewHolder.

Que se passe-t-il si le texte ou quoi que ce soit qui doit être passé à la prochaine activité n’existe pas vraiment dans les vues auxquelles le ViewHolder a accès, mais fait plutôt partie de l’activité contenant le RecyclerView?

Dans ce cas, onClickListener doit être implémenté dans l'activité pour que le texte puisse être transféré. C'est possible.

  1. Une solution consiste à ajouter une vue invisible contenant ce texte, puis à faire ce qui a déjà été fait. implémentation de onClickListener dans l'adaptateur. 

  2. Transmettez ce texte, en quelque sorte, à l'adaptateur.

Comment peut "2." être implémenté?

13
Abhishek Soni

Ecrivez une fonction publique dans votre activité comme:

public void onClickCalled(String anyValue) {
    // Call another acitivty here and pass some arguments to it.
}

Maintenant, dans la fonction onClick de votre adaptateur 

@Override
public void onClick(View view) {
    ((YouActivityClass) context).onClickCalled("your argument here");
}
12
Adnan Amjad

Voir l'exemple ci-dessous pour créer RecyclerViewOnClick.

Exemple de code:

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

public interface OnItemClickListener {
    void onItemClick(ContentItem item);
}

private final List<ContentItem> items;
private final OnItemClickListener listener;

public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
    this.items = items;
    this.listener = listener;
}

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false);
    return new ViewHolder(v);
}

@Override public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bind(items.get(position), listener);
}

@Override public int getItemCount() {
    return items.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView name;
    private ImageView image;

    public ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.name);
        image = (ImageView) itemView.findViewById(R.id.image);
    }

    public void bind(final ContentItem item, final OnItemClickListener listener) {
        name.setText(item.name);
        Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                listener.onItemClick(item);
            }
        });
    }
}
}

Et utilisez RecyclerView Adapter en utilisant le code ci-dessous:

recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
@Override public void onItemClick(ContentItem item) {
    Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
}
}));

See Définir un écouteur de clic sur un RecyclerView

J'espère que cela vous a aidé.

20
pRaNaY

Où ListView a un onItemClickListener, RecyclerView a addOnItemTouchListener .

Vous pouvez fournir l'écouteur à la vue du recycleur à partir de l'activité. Ainsi, la portée sera telle que l'écouteur devrait pouvoir référencer le texte.

Vous pouvez utiliser quelque chose comme après la mise en œuvre de OnItemTouchListener, qui fonctionne également pour capturer les balayages gauche et droit.

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

    private static final String TAG = "RecyclerTouchListener";

    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    private static final int SWIPE_MAX_OFF_PATH = 250;

    private OnTouchActionListener mOnTouchActionListener;
    private GestureDetectorCompat mGestureDetector;

    public static interface OnTouchActionListener {
        public void onLeftSwipe(View view, int position);
        public void onRightSwipe(View view, int position);
        public void onClick(View view, int position);
    }

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView,
                             OnTouchActionListener onTouchActionListener){

        mOnTouchActionListener = onTouchActionListener;
        mGestureDetector = new GestureDetectorCompat(context,new GestureDetector.SimpleOnGestureListener(){

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.d(TAG, "On Single Tap Confirmed");
            // Find the item view that was swiped based on the coordinates
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            int childPosition = recyclerView.getChildPosition(child);
            mOnTouchActionListener.onClick(child, childPosition);
            return false;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2,
                               float velocityX, float velocityY) {
            Log.d(TAG, "onFling: " + e1.toString() + e2.toString());

            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
                    return false;
                }

                // Find the item view that was swiped based on the coordinates
                View child = recyclerView.findChildViewUnder(e1.getX(), e1.getY());
                int childPosition = recyclerView.getChildPosition(child);

                // right to left swipe
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                    Log.d(TAG, "Left Swipe");
                    if (mOnTouchActionListener != null && child != null) {
                        mOnTouchActionListener.onLeftSwipe(child, childPosition);
                    }

                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.d(TAG, "Right Swipe");
                    if (mOnTouchActionListener != null && child != null) {
                        mOnTouchActionListener.onRightSwipe(child, childPosition);
                    }
                }
            } catch (Exception e) {
                // nothing
            }

            return false;
        }
    });
}

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        // do nothing
    }

}

Ensuite, dans votre activité, ajoutez votre auditeur suivant les lignes de

 mRecyclerView.addOnItemTouchListener(
        new RecyclerTouchListener(getActivity(), mRecyclerView,
            new RecyclerTouchListener.OnTouchActionListener() {
                @Override
                public void onClick(View view, int position) {
                }
                @Override
                public void onRightSwipe(View view, int position) {
                }
                @Override
                public void onLeftSwipe(View view, int position) {
                }
            }))
1
34m0

Cela peut être résolu en créant votre propre auditeur et en le transmettant à l'adaptateur.

public interface PositionClickListener
{
    void itemClicked(int position);
}

L'activité peut implémenter cette interface ou instancier une classe interne anonyme. Ainsi, votre adaptateur pourrait ressembler à ceci:

public class MyRecyclerAdapter extends RecyclerView.Adapter
{
    public final PositionClickListener listener;

    public MyRecyclerAdapter(PositionClickListener listener)
    {
         this.listener = listener;
    }

    private void createView(int position)
    {
        View v = new View();
        v.setOnClickListener(new OnClickListener(){
            listener.itemClicked(position);
        });
    }
}
1
a person

c'est facile, nous n'avons pas créer d'interfaces, regardez mon code, mettez ce petit code et nous sommes 

@Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
      holder.img.setImageDrawable(img[position%img.length]);
        holder.bodyPartName.setText(bodyPart[position]);
        if(position==0) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context c = v.getContext();
                    Intent intent = new Intent(c, BodyPartExcercise.class);
                    c.startActivity(intent);
                }
            });
        }
    }
0
chetan muliya