A RecyclerView
не предоставляет функции обратного вызова OnClick по умолчанию. Таким образом, вы можете создать OnTouchListener для использования событий кликов.
public class RVClickHandler implements View.OnTouchListener {
private RecyclerView mRecyclerView;
private float mStartX;
private float mStartY;
public RVClickHandler(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean isConsumed = false;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
mStartX = event.getX();
mStartY = event.getY();
break;
}
case MotionEvent.ACTION_UP: {
float endX = event.getX();
float endY = event.getY();
if(detectClick(mStartX, mStartY, endX, endY)) {
//Ideally it would never be called when a child View is clicked.
//I am not so sure about this.
View itemView = mRecyclerView.findChildViewUnder(endX, endY);
if(itemView == null) {
//RecyclerView clicked
mRecyclerView.performClick();
isConsumed = true;
}
}
break;
}
}
return isConsumed;
}
private static boolean detectClick(float startX, float startY, float endX, float endY) {
return Math.abs(startX-endX) < 3.0 && Math.abs(startY-endY) < 3.0;
}
}
добавьте это к вашему RecyclerView
следующим образом
recyclerView.setOnTouchListener(new RVClickHandler(recyclerView));
Теперь вы можете прикрепить обычный OnClickListener для обработки кликов.
recyclerView.setOnClickListener((v) -> {
//Called when an empty space is clicked inside RecyclerView.
});
События кликов для дочерних представлений могут обрабатываться внутри ViewHolder