I have RecyclerView
which is HORIZONTAL
. Width of each item in it nearly equals the total width of recycler. Only up to 3 ViewHolders
are visible.
Here's some mockup for better understanding of how the result looks.
I want to add ability to reposition cards in my RecyclerView
so I created ItemTouchHelper.Callback
and attached it to RecyclerView
.
Once I longpress on any card I'm able to drag it to the left and right. When I move it near the screen edge RecyclerView
automatically starts to scroll and then my view disappears.
From what I was able to find out I guess that it simply will get recycled - ItemTouchHelper#clearView(RecyclerView, RecyclerView$ViewHolder)
is called and it originates from RecyclerView#removeDetachedView(View)
.
Is there any was I can bypass this behaviour?
ItemTouchHelper.Callback drag = new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.START | ItemTouchHelper.END | ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragFlags, ItemTouchHelper.ACTION_STATE_IDLE);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int oldPosition = viewHolder.getAdapterPosition();
int newPosition = target.getAdapterPosition();
Log.d(getClass().getSimpleName(), String.format("View moved from %d to %d", oldPosition, newPosition));
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// Not applicable
}
};
mView.recycler.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
mView.recycler.setAdapter(mAdapter = new SimpleAdapter());
ItemTouchHelper touchHelper = new ItemTouchHelper(drag);
touchHelper.attachToRecyclerView(mView.recycler);