RecyclerView滑动和移动项目不适用于Android中的BottomSheetDialog

问题描述 投票:1回答: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()方法。

android android-recyclerview bottom-sheet itemtouchhelper
1个回答
0
投票

可能是一个愚蠢的建议,但由于您有相同的建议,我最终解决了您的问题。当您拖动一个项目时,只需在该项目上长按一下就可以拖动它。

代码本身看起来不错。

© www.soinside.com 2019 - 2024. All rights reserved.