转自:http://blog.csdn.net/liaoinstan/article/details/51200600
android开发游记:RecyclerView无法添加onItemClickListener最佳的高效解决方案
前言
之前最多的可能是在adapter中自己写一个itemClickListener来实现!下面使用RecyclerView中的addOnItemTouchListener()来实现!
实现
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public abstract class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private GestureDetectorCompat mGestureDetector;
private RecyclerView recyclerView;
public OnRecyclerItemClickListener(RecyclerView recyclerView) {
this.recyclerView = recyclerView;
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),
new ItemTouchHelperGestureListener());
}
public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);
public abstract void onItemLongClick(RecyclerView.ViewHolder viewHolder);
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null) {
RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
onItemClick(viewHolder);
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null) {
RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
onItemLongClick(viewHolder);
}
}
}
}
然后使用:
recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(recyclerView) {
@Override
public void onItemClick(RecyclerView.ViewHolder viewHolder) {
...
}
@Override
public void onItemLongClick(RecyclerView.ViewHolder viewHolder) {
...
}
});