Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

RecyclerView ItemTouchHelper swipe undo

#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 собрал за час.

Комментариев нет:

Отправить комментарий