#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 собрал за час.
Комментариев нет:
Отправить комментарий