I've created a horizontal listview of images using recyclerview , when i click on a particular image ,i want change the background image with that image of my activity , but i'm facing the problem, how i can set onItem click for recyclerview items in my mainactivity??
Asked
Active
Viewed 8,428 times
3 Answers
6
May be it will help you but I did like this in my code :
RecyclerView recyclerView = findViewById(R.id.recycler);
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(context, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
// do whatever
}
@Override public void onLongItemClick(View view, int position) {
// do whatever
}
})
);
RecyclerItemClickListener
implementation:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
public void onLongItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && mListener != null) {
mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
}
}
});
}
@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
return true;
}
return false;
}
@Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
}

Abhinav Gupta
- 2,225
- 1
- 14
- 30
2
public class MyRecycleViewClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
public void onItemClick(View view, int position);
}
GestureDetector mGestureDetector;
public MyRecycleViewClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
use this as following
mRecyclerView.addOnItemTouchListener(new MyRecycleViewClickListener(this, new MyRecycleViewClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
}
}));

Amardeep
- 1,414
- 11
- 18
-
Thnx friends, got my problem solved – user9308577 Feb 06 '18 at 12:50
0
You can have your adapter extending from this adapter:
/**
* Enables subclasses to add itself as an OnClickListener when binding. This enables the registered
* listener of type {@link OnItemClickListener} to receive an onItemClick callback.
*/
public abstract class ItemClickRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>
implements View.OnClickListener {
/**
* A similar interface to that of ListView lore.
*/
public interface OnItemClickListener {
void onItemClick(RecyclerView recyclerView, View view, int position);
}
protected WeakReference<RecyclerView> mAttachedRecyclerViewReference;
protected OnItemClickListener mOnItemClickListener;
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mAttachedRecyclerViewReference = new WeakReference<>(recyclerView);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
mAttachedRecyclerViewReference = null;
}
@CallSuper
@Override
public void onBindViewHolder(VH holder, int position) {
holder.itemView.setOnClickListener(this);
}
@CallSuper
@Override
public void onViewRecycled(VH holder) {
holder.itemView.setOnClickListener(null);
}
/**
* Provides access to the currently attached recycler view.
*/
public RecyclerView getAttachedRecyclerView() {
return mAttachedRecyclerViewReference.get();
}
/**
* Get the registered item click listener.
*/
public OnItemClickListener getOnItemClickListener() {
return mOnItemClickListener;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
@Override
public void onClick(View v) {
if (mAttachedRecyclerViewReference != null && mAttachedRecyclerViewReference.get() != null && mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(mAttachedRecyclerViewReference.get(), v, mAttachedRecyclerViewReference.get().getChildAdapterPosition(v));
}
}
And use it like this:
MyAdapter adapter = new MyAdapter();
adapter.setOnItemClickListener(this::itemClicked);
private void itemClicked(RecyclerView recyclerView, View view, int position) {
//Handle item click here
}

Manos
- 1,471
- 1
- 28
- 45