RecyclerView - элементы перерабатываются при перетаскивании - PullRequest
0 голосов
/ 22 мая 2018

У меня RecyclerView, что HORIZONTAL.Ширина каждого элемента в нем почти равна общей ширине переработчика.Видно только до 3 ViewHolders.

Вот несколько макетов для лучшего понимания того, как выглядит результат.

enter image description here

IЯ хочу добавить возможность изменять положение карточек в моем RecyclerView, поэтому я создал ItemTouchHelper.Callback и прикрепил его к RecyclerView.

После долгого нажатия на любую карту я могу перетащить ее влево и вправо,Когда я подношу его к краю экрана, RecyclerView автоматически начнет прокручиваться, и мой взгляд исчезнет.

Из того, что я смог выяснить, я предполагаю, что он просто будет переработан - вызывается ItemTouchHelper#clearView(RecyclerView, RecyclerView$ViewHolder) иэто происходит от RecyclerView#removeDetachedView(View).

Есть ли кто-нибудь, я мог обойти это поведение?

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);

Stack from debugger when View disappears

1 Ответ

0 голосов
/ 22 мая 2018

В вашем ItemTouchHelper.Callback, когда вы начинаете перетаскивать, попробуйте установить

viewHolder.setIsRecyclable(false)

, затем, когда вы закончите перетаскивание

viewHolder.setIsRecyclable(true)
...