3 点击事件
ListView的Item项的点击事件项目中一般会用到两个,一个是OnClickListener,另一个是OnLongClickListener。
由于RView已经不支持这两个事件的回调,因此,我们需要从其他途径来监听单击和长按,这时就需要用到手势监听。首先我们需要写下面这个类:
private class RecyclerViewDemoOnGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
View view = recyclerView.findChildViewUnder(e.getX(), e.getY()); //获取点击项的view
int idx = recyclerView.getChildPosition(view);//获取点击项view在adapter的索引位置
Log.e("onSingleTapConfirmed", "getChildPosition=" + idx);
return super.onSingleTapConfirmed(e);
}
public void onLongPress(MotionEvent e) {
View view = recyclerView.findChildViewUnder(e.getX(), e.getY());//获取点击项的view
int idx = recyclerView.getChildPosition(view);//获取点击项view在adapter的索引位置
Log.e("onLongPress", "getChildPosition=" + idx);
super.onLongPress(e);
}
}
可以看到里面有两个回调方法,顾名思义,一个是单击,一个是长按,在里面我们可以通过RView的findChildViewUnder方法获取点击的对象视图,然后通过这个视图和RView的getChildPosition来获取该视图在整个列表里的位置,这个位置与adapter里的位置是对应的,由此,便可以通过这两个对象完成点击事件的其余操作。
但手势必须要通过View的OnTouchListener才能监听得到,毕竟手势这个类是用来帮助识别各种手势的,所以还需要给RView添加OnItemTouchListener事件。
recyclerView.addOnItemTouchListener(this);
那么在其回调中我们需要做得事情就是将事件分流到手势监听里去并让事件继续往下传递。
@Override public boolean onInterceptTouchEvent(RecyclerView recyclerView,
MotionEvent motionEvent) {
gestureDetector.onTouchEvent(motionEvent);
return false;
}
@Override public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
}
最后,初始化手势监听必不可少:
gestureDetector =
new GestureDetectorCompat(this, new RecyclerViewDemoOnGestureListener());