Я пытаюсь реализовать swipe, чтобы отклонить действие в RecyclerView, но когда я устанавливал OnClickListener на любом представлении в ViewHolder, он переопределяет все события OnTouch в этом представлении.
Я могу отказаться от OnClickListener и обрабатывать все клики в TouchListener, но если у меня есть несколько кнопок в дочернем представлении RecycleView, это будет много кода, и это не похоже на правильный путь.
В моем RecyleView я устанавливаю Swipe для отклонения слушателей (похожих на это):
setOnTouchListener(touchListener);
setOnScrollListener(touchListener.makeScrollListener());
Он работает в ListView, но в RecycleView OnClickListener блокирует события OnTouchListner.
Пример макета для представления ViewHolder.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="72dp"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/keep_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_received" />
Наращивание в RecyclerView.Adapter:
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = mInflater.inflate(R.layout.push_card_view_compat, viewGroup, false);
return new ViewHolder(v, onClickListener, onKeepListener);
}
The ViewHolder:
public ViewHolder(final View itemView,
final OnViewHolderClickListener onClickListener,
final OnKeepListener onKeepListener) {
super(itemView);
keepButton = (ImageView) itemView.findViewById(R.id.keep_icon);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onClick(getPosition(), itemView);
}
});
keepButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onKeepListener.onClick(getPosition(), itemView);
}
});
}