Reputation: 33
I have recycler view with OnItemTouchListener and each row this recycler has a button with onclick event.
I want after click button event work but OnItemTouchListener work.
please help. my code.
public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener {
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerViewTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
this.clickListener=clickListener;
gestureDetector=new GestureDetector(new GestureDetector.SimpleOnGestureListener(){
@SuppressWarnings("deprecation")
@Override
public boolean onSingleTapUp(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child!=null && clickListener!=null){
clickListener.OnClick(child,recyclerView.getChildPosition(child));
}
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
//noinspection deprecation
clickListener.OnClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public static interface ClickListener {
void OnClick(View view,int position);
}
}
this code in viewholder
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
callbacks.removePosition(getAdapterPosition());
}
});
Upvotes: 0
Views: 7318
Reputation: 2608
Sorry for my straightness, but first of all delete this code. Then you need to create your own RecyclerAdapter that will have such snippet of code:
View.OnClickListener clickListener;
public void setOnItemClickListener(View.OnClickListener clickListener) {
this.clickListener = clickListener;
}
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (onClickListener != null) {
holder.itemView.setOnClickListener(clickListener);
}
}
Then somewhere where you work with RecyclerView (Activity, Fragment, custom View, custom Wrapper for View) you should do something like that:
List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems);
adapter.setOnItemClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = orderListView.getChildAdapterPosition(v);
SomeItem item = someItems.get(position);
Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")");
}
});
recyclerView.setAdapter(adapter);
Next to your question about clicking on buttons inside any item. Define your own Holder that keeps references for View components inside you item:
public static class MyHolder extends RecyclerView.ViewHolder {
private final Button deleteButton;
public MyHolder(View itemView) {
super(itemView);
deleteButton = (Button) itemView.findViewById(R.id.delete_button);
}
public Button getDeleteButton() {
return deleteButton;
}
}
Then define your own inteface for define clicks on delete button. For example:
public interface OnDeleteButtonItemClickListener {
void onDeleteIsClick(View button, int position);
}
Then attach your interface to Adapter:
View.OnClickListener clickListener;
OnDeleteButtonItemClickListener deleteButtonListener;
public void setOnItemClickListener(View.OnClickListener clickListener) {
this.clickListener = clickListener;
}
public void setDeleteButtonListener(OnDeleteButtonItemClickListener deleteButtonListener) {
this.deleteButtonListener= deleteButtonListener;
}
@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (clickListener!= null) {
holder.itemView.setOnClickListener(clickListener);
}
if (deleteButtonListener!= null) {
MyHolder myHolder = (MyHolder) holder;
myHolder.getDeleteButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteButtonListener.onDeleteIsClick(v, position)
}
});;
}
}
And then update your place, where you work with RecyclerView:
List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems);
adapter.setOnItemClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = orderListView.getChildAdapterPosition(v);
SomeItem item = someItems.get(position);
Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")");
}
});
adapter.setDeleteButtonListener(new OnDeleteButtonItemClickListener {
@Override
public void onDeleteIsClick(View button, int position) {
SomeItem item = someItems.get(position);
Log.v("CLICKED", "Clicking on delete button of item(" + position + ", " + item + ")");
}
});
recyclerView.setAdapter(adapter);
Upvotes: 6