本篇文章主要介绍了"android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下:
【转自:http://blog.csdn.net/liaoinstan/article/details/51200600】
自从RecyclerView发布以...
【转自:http://blog.csdn.net/liaoinstan/article/details/51200600】
自从RecyclerView发布以来,由于其高度的可交互性被广泛使用。但是RecyclerView确没有像ListView一样提供onItemClickListener却让人比较难过,网上搜索了一番有不少解决方案,但是其本质都是通过给每个item添加onClickListener来模仿一个伪onItemClickListener,这种为每个item添加点击监听的解决方案不用多想也知道是浪费性能的方法。能不能像ListView那样使用一个监听解决问题呢?
查阅RecyclerView的api发现虽然没有提供onItemClickListener但是提供了addOnItemTouchListener方法:
RecyclerView.addOnItemTouchListener(OnItemTouchListener listener)
既然可以添加触摸监听,那么我们完全可以获取触摸手势来识别点击事件,然后通过触摸坐标来判断点击的是哪一个item,虽然听起来比较复杂,但是sdk 的 api已经为我们实现了大部分方法,我们只需要实现接口几行代码就可以搞定了。
下面先说一下使用方法,后面详细介绍其实现原理:
如何使用
recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(recyclerView) {
@OverridepublicvoidonItemClick(RecyclerView.ViewHolder vh) {
//item点击事件
}
});
其中OnRecyclerItemClickListener是自定义的一个触摸监听器,代码如下:
仅有短短十多行代码,sdk已经为我们实现了大部分功能
publicabstractclassOnRecyclerItemClickListenerimplementsRecyclerView.OnItemTouchListener{private GestureDetectorCompat mGestureDetector;
private RecyclerView recyclerView;
publicOnRecyclerItemClickListener(RecyclerView recyclerView){
this.recyclerView = recyclerView;
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());
}
@OverridepublicbooleanonInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
returnfalse;
}
@OverridepublicvoidonTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
}
@OverridepublicvoidonRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
privateclassItemTouchHelperGestureListenerextendsGestureDetector.SimpleOnGestureListener {@OverridepublicbooleanonSingleTapUp(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child!=null) {
RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);
onItemClick(vh);
}
returntrue;
}
//长点击事件,本例不需要不处理//@Override//public void onLongPress(MotionEvent e) {// View child = recyclerView.findChildViewUnder(e.getX(), e.getY());// if (child!=null) {// RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(child);// onItemLongClick(vh);// }//}publicabstractvoidonItemClick(RecyclerView.ViewHolder vh);
//public abstract void onItemLongClick(RecyclerView.ViewHolder vh);
}
以上就是全部的代码了,看起来很少,其实包含的内容还是比较多的,下面详细剖析下其实现原理:
实现原理
查阅api发现,RecyclerView提供了设置触摸监听的方法,那么我们定义一个类OnRecyclerItemClickListener实现OnItemTouchListener,我们需要实现其3个方法: