I do svayp with removal for RecyclerView ItemTouchHelper

There is a FrameLayout with two layouts. The top front snaps into the side. and below it is the second layout_back with the "Hide" and "Cancel" buttons.

After the swipe, a second layer with buttons appears below it, but for some reason, clicks on them do not work the first time.

public class MyItemTouchHelper extends ItemTouchHelper.SimpleCallback { private ItemAdapter itemAdapter; private RecyclerView recyclerView; public MyItemTouchHelper(RecyclerView mRecyclerView, ItemAdapter itemAdapter) { super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); this.itemAdapter = itemAdapter; this.recyclerView = mRecyclerView; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { return makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.RIGHT) | makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); } @Override public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { return 0; } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) { ((ItemAdapter.ItemViewHolder) viewHolder).itemCancel.setEnabled(true); ((ItemAdapter.ItemViewHolder) viewHolder).itemDelete.setEnabled(true); ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.setVisibility(View.VISIBLE); ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.bringToFront(); ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.invalidate(); ((ItemAdapter.ItemViewHolder) viewHolder).itemDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "DELETE " + viewHolder.getAdapterPosition(), Toast.LENGTH_SHORT).show(); itemAdapter.removeItem(viewHolder.getAdapterPosition()); } }); ((ItemAdapter.ItemViewHolder) viewHolder).itemCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "CANCEL " + viewHolder.getAdapterPosition(), Toast.LENGTH_SHORT).show(); ((ItemAdapter.ItemViewHolder) viewHolder).itemContainer.setVisibility(View.INVISIBLE); recyclerView.getAdapter().notifyItemChanged(viewHolder.getAdapterPosition()); clearView(recyclerView, viewHolder); ((ItemAdapter.ItemViewHolder) viewHolder).itemCancel.setEnabled(false); ((ItemAdapter.ItemViewHolder) viewHolder).itemDelete.setEnabled(false); ((ItemAdapter.ItemViewHolder) viewHolder).itemContext.bringToFront(); ((ItemAdapter.ItemViewHolder) viewHolder).itemContext.invalidate(); } }); } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { if (viewHolder.getAdapterPosition() == -1) { return; } if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { if (dX > 0 || dX < 0) { getDefaultUIUtil().onDraw(c, recyclerView, ((ItemAdapter.ItemViewHolder) viewHolder).getSwipableView(), dX, dY, actionState, isCurrentlyActive); } } } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); View foreground = ((ItemAdapter.ItemViewHolder) viewHolder).getSwipableView(); getDefaultUIUtil().clearView(foreground); } } 

 <ImageView android:id="@+id/icon" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_gravity="center_vertical" android:padding="8dp"/> <include android:id="@+id/contprice" layout="@layout/quest_price" style="@style/wrap" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true"/> <LinearLayout style="@style/wrap.linear" android:layout_gravity="center_vertical" android:layout_toLeftOf="@id/contprice" android:layout_toRightOf="@id/icon" android:layout_weight="0.4"> <TextView android:id="@+id/title" style="@style/quest_title" android:text="Рассказать друзьям"/> <TextView android:id="@+id/details" style="@style/quest_detail"/> </LinearLayout> 

layout_back :

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerVertical="true" android:background="@android:color/transparent"> <TextView android:id="@+id/cancel" android:textColor="#0eb0a0" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" android:gravity="center" android:padding="10dp" android:text="Отмена" android:textStyle="bold"/> <TextView android:id="@+id/delete" android:textColor="#e6007e" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" android:gravity="center" android:padding="10dp" android:text="Скрыть" android:textStyle="bold"/> </RelativeLayout> 

trying to bring layout_back to the fore
bringToFront() and redraw invalidate() , but it still doesn’t help, clicks on buttons work 5 times.

  • Hello! Problem solved? It also became actual ... - dramf
  • @dramf not yet - Trunks ssj
  • solved the problem of layers - Trunks ssj
  • Share the solution? I no longer relevant, but interesting) - dramf
  • @dfarm when onSwiped redraws the holder with the second layer - Trunks ssj

1 answer 1

Having spent two days with a similar problem, I decided to use AndroidSwipeLayout: https://github.com/daimajia/AndroidSwipeLayout collected in an hour.

  • Yes, I saw this libu - Trunks ssj
  • I have not found anything better ... - dramf
  • with onSwiped I redraw the holder with the second layer - Trunks ssj