[英]how to handle both RecyclerView on item click listener for its rows and the views inside it
I have recyclerView which contains some text view and 2 image view. 我有的recyclerView包含一些文本视图和2个图像视图。
I would like to do a task when user clicks on each row and another task when user clicks on each of image views .. but I can only handle one of them at the same time. 当用户点击每个图像视图时,我想在用户点击每一行和另一个任务时执行任务..但我只能同时处理其中一个。
Now if I set recylerview.addOnItemTouchListener
I can't handle images views onclicks with setting on clicklistener
for them in the adapter because when user clicks on image view the row's click listener will trigger. 现在,如果我设置了
recylerview.addOnItemTouchListener
我无法在适配器中使用clicklistener
设置处理图像视图onclicks,因为当用户单击图像视图时,行的点击监听器将触发。
Below code is my class for handling recycler view items 下面的代码是我的处理回收站视图项目的类
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){}
and this is my holder inside adapter 这是我在适配器内的持有人
public MyViewHolder(View view) {
super(view);
tv_word = (TextView) view.findViewById(R.id.tv_word_show);
tv_english = (TextView) view.findViewById(R.id.tv_english_show);
tv_translation = (TextView) view.findViewById(R.id.tv_tranlation_show);
tv_numbershow = (TextView) view.findViewById(R.id.tv_numershow);
fav = (ImageView) view.findViewById(R.id.iv_fav);
more = (ImageView) view.findViewById(R.id.iv_more);
fav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext,"show some text for test",Toast.LENGTH_LONG).show();
}
});
I appreciate any help for my problem 我感谢任何帮助我的问题
Create Interface in you adapter class. 在适配器类中创建接口。
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public interface ClickListener {
void ItemClicked(View v, int position);
}
Declare the object on top like this: 像这样在顶部声明对象:
ClickListener clickListener;
holder.view.setOnclickListener(new OnclickListener(
@Override
public void onClick(View v) {
if (clickListener != null) {
clickListener.ItemClicked(v, getAdapterPosition());
}
}
);
Implement this interface in class and intialize the clicklistener where you are setting adapter to recyclerview. 在类中实现此接口并初始化clicklistener,您将适配器设置为recyclerview。
adapter.setClickListener(this);
When you will implement this in class you will get following method: 当你在课堂上实现这个时,你会得到以下方法:
@Override
public void ItemClicked(View v, int position) {
}
Apply switch case from v.getId()
you can handle as many click listeners you need to implement. 从
v.getId()
应用switch case,您可以处理需要实现的单击侦听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.