#java #android #recyclerview #swipe #swipelayout
Делаю свайп с удалением для RecyclerView ItemTouchHelper есть FrameLayout с двумя лайоутами верхний front свайпится в бок. а под ним второй layout_back с кнопками "Скрыть" и "Отмена". После свайпа, под ним появляется второй слой с кнопками, но почему то клики на них срабатывают не с первого раза. 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); } }layout_back: пытаюсь вынести layout_back на передний план bringToFront() и перерисовываю invalidate(), но все равно не помогает, срабатывают клики на кнопках раз на 5.
Ответы
Ответ 1
Два дня просидев с аналогичной проблемой, решил использовать AndroidSwipeLayout: https://github.com/daimajia/AndroidSwipeLayout собрал за час.
Комментариев нет:
Отправить комментарий