Как обновить список после перетаскивания элементов в RecyclerView? - PullRequest
0 голосов
/ 31 января 2019

Я реализовал ItemTouchHelper для настройки перетаскивания снизу вверх и сверху вниз, когда проведено сканирование, после чего он должен обновить список.Но не работает метод обратного вызова, из-за которого мне приходится обновлять список.

Когда я смахиваю свой список, то после завершения сканирования он не вызывает onMoved или onSwiped.

Исходный код:

ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,0) {
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder dragged, RecyclerView.ViewHolder target) {
        int position_dragged = dragged.getAdapterPosition();
        int position_target = target.getAdapterPosition();
        adapter.notifyItemMoved(position_dragged,position_target);
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        //Toast.makeText(getActivity(),"swiped",Toast.LENGTH_SHORT).show();
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onMoved(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, int fromPos, @NonNull RecyclerView.ViewHolder target, int toPos, int x, int y) {
        super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
        adapter.notifyDataSetChanged();
    }
});
helper.attachToRecyclerView(null);
helper.attachToRecyclerView(myRecyclerView);

1 Ответ

0 голосов
/ 23 июня 2019
  1. Создать новый файл -> DragSwipeHelper.java
  2. Скопировать следующий код в созданный файл
  3. Заменить YourAdapter именем класса вашего адаптера
  4. орудие ItemTouchHelperAdapter интерфейс в вашем классе адаптера
    public class DragSwipeHelper extends ItemTouchHelper.Callback {

     // implement this interfaces in your adapter class
      public interface ItemTouchHelperAdapter {
        boolean onItemMove(int fromPosition, int toPosition);
        void onItemSwipe(int position);
        void onAfterMove();
      }


      private Context _context;
      private final YourAdapter mAdapter;

      public DragSwipeHelper(Context context, YourAdapter adapter) {
        _context = context;
        mAdapter = adapter;
      }

      @Override
      public boolean isLongPressDragEnabled() {
        return true;
      }

      @Override
      public boolean isItemViewSwipeEnabled() {
        return true;
      }

      @Override
      public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);
      }

      @Override
      public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
      }

      @Override
      public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mAdapter.onItemSwipe(viewHolder.getAdapterPosition());
      }

      @Override
      public void onChildDrawOver(@NonNull Canvas c, @NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        if (!isCurrentlyActive && actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
          new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
              mAdapter.onAfterMove();
            }
          }, 250);
        }
      }
    }

Присоединить DragSwipeHelper к RecyclerView
    ItemTouchHelper.Callback callback = new DragSwipeHelper(this, adapter);
    ItemTouchHelper helper = new ItemTouchHelper(callback);
    helper.attachToRecyclerView(mRecyclerView);
...