1.recyclerview item内部控件没有点击事件
在recyclerview item内部控件不存在点击事件的情况下。item设置点击事件可通过添加触摸事件
recyclerview.addOnItemTouchListener();//为item添加触摸事件监听
OnItemTouchListener 的相应定义
/**处理类*/
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
public boolean onSingleTapUp(MotionEvent event){
View child = recyclerView.findChildViewUnder(event.getX(), event.getY());
if (child != null){
RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
onItemClick(viewHolder);
}
return true;
}
public void onLongPress(MotionEvent event){
View child = recyclerView.findChildViewUnder(event.getX(), event.getY());
if (child != null){
RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
onItemLongClick(viewHolder);
}
}
}
/**通用recyclerView item点击事件实现*/
public abstract MyItemClickListener implments RecylerView.OnItemTouchListener{
//view
private final RecyclerView recyclerView;
//手势识别类
private final GestureDetectorCompat mGestureDetector;
public MyItemClickListener(RecyclerView recyclerView){
this.recyclerView = recyclerView;
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
return false;
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
//直接将上面的类写作内部类并调用下方的方法。
public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);
public abstract void onItemLongClick(RecyclerView.ViewHolder viewHolder);
}
此方法只适用于item 内部控件无监听事件。
2.item 内部控件点击事件
此种情况针对内部item有监听事件
适配器中通过实现点击事件、长按事件来实现item的点击、长按事件。
//监听器 这里方便设置调用点击、长按事件直接写在一个监听类中
public interface MyItemClickListener{
void onItemClick();
void onItemLongClick();
}
//适配器
MyItemClickListener listener=null;
onCreateViewHolder() 中设置点击、长按事件。
v.setOnClickListener(this);
v.setOnLongClickListener(this);
onBindViewHolder()方法中
为view设置tag;
holder.itemView.setTag(position);
调用方法设置
public void setOnItemListener(MyItemClickListener listener){
this.listener=listener;
}
@Override
public void onClick(View v) {
if(listener!=null){
listener.onItemClick
}
}
直接在adapter实例之后进行事件的调用。在相对应的地方try{}catch(Exception e){}
以上为实际编码中遇到的事件传递问题的解决。