1

我想使用 ItemTouchHelper 类在 RecyclerView 中滑动和拖放项目。RecyclerView 放置在 BottomSheetDialog 内。

以下是设置 RecyclerView 的代码

musicAdapterRecyclerView = new MusicAdapterRecyclerView(this, mainList);
    playlistRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    playlistRecyclerView.setClickable(true);
    playlistRecyclerView.setHasFixedSize(false);
    playlistRecyclerView.setAdapter(musicAdapterRecyclerView);
    bottomSheetDialog.setContentView(view);
    bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialogInterface) {
            BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) dialogInterface;
            FrameLayout bottomSheet = (FrameLayout) bottomSheetDialog
                    .findViewById(android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_COLLAPSED);
        }
    });
    playlistRecyclerView.scrollToPosition(playingIndex);
    playlistRecyclerView.setNestedScrollingEnabled(false);
    setupItemTouchHelper();

以下是在 RecyclerView 上设置 ItemTouchHelper 类的代码

 public void setupItemTouchHelper(){
    final ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback() {
        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            adapterRecyclerView =(MusicAdapterRecyclerView) recyclerView.getAdapter();

            int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            return makeMovementFlags(dragFlags, swipeFlags);
        }



        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            int fromPosition = viewHolder.getAdapterPosition();
            int toPosition = target.getAdapterPosition();
            if (fromPosition < toPosition) {
                for (int i = fromPosition; i < toPosition; i++) {
                    Collections.swap(mainList, i, i + 1);
                }
            } else {
                for (int i = fromPosition; i > toPosition; i--) {
                    Collections.swap(mainList, i, i - 1);
                }
            }
            musicAdapterRecyclerView.notifyItemMoved(fromPosition, toPosition);
            return true;

        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

            final int pos = viewHolder.getAdapterPosition();
            if(pos<0 && pos>=mainList.size()){
                return;
            }

            mainList.remove(pos);
            adapterRecyclerView.removeItem(pos);
            adapterRecyclerView.notifyItemRemoved(pos);
            adapterRecyclerView.notifyItemRangeChanged(pos,mainList.size());

        }




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

        @Override
        public boolean isItemViewSwipeEnabled() {
            return true;
        }
    };
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
    itemTouchHelper.attachToRecyclerView(playlistRecyclerView);

}

问题

  1. 当用户在 recyclerView 上滑动项目时,mainList 会更新,滑动动画正常工作,但除非滚动,否则 RecyclerView 不会更新。

  2. 用于不调用拖放(重新排列项目)的 ItemTouchHelper 的 OnMove() 方法。

4

0 回答 0