Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RecyclerView滑动和移动项目在Android中无法使用BottomSheetDialog_Android_Android Recyclerview_Bottom Sheet_Itemtouchhelper - Fatal编程技术网

RecyclerView滑动和移动项目在Android中无法使用BottomSheetDialog

RecyclerView滑动和移动项目在Android中无法使用BottomSheetDialog,android,android-recyclerview,bottom-sheet,itemtouchhelper,Android,Android Recyclerview,Bottom Sheet,Itemtouchhelper,我想使用ItemTouchHelper类在RecyclerView中滑动和拖放项目。RecyclerView位于BottomSheetDialog内 以下是设置RecyclerView的代码 musicAdapterRecyclerView = new MusicAdapterRecyclerView(this, mainList); playlistRecyclerView.setLayoutManager(new LinearLayoutManager(this)); pla

我想使用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();
 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);

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

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

}
public void setupItemTouchHelper(){
final ItemTouchHelper.Callback Callback=new ItemTouchHelper.Callback(){
@凌驾
public int getMovementFlags(RecyclerView RecyclerView,RecyclerView.ViewHolder ViewHolder){
AdapterRecyclView=(MusicAdapterRecyclView)RecyclView.getAdapter();
int dragFlags=ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags=ItemTouchHelper.START | ItemTouchHelper.END;
返回makeMovementFlags(dragFlags、swipeFlags);
}
@凌驾
公共布尔onMove(RecyclerView RecyclerView、RecyclerView.ViewHolder ViewHolder、RecyclerView.ViewHolder目标){
int fromPosition=viewHolder.getAdapterPosition();
int-toPosition=target.getAdapterPosition();
如果(从位置<位置){
for(inti=fromPosition;itoPosition;i--){
集合交换(主列表,i,i-1);
}
}
musicAdapterRecyclerView.notifyItemMoved(从位置、位置);
返回true;
}
@凌驾
公共空间(RecyclerView.ViewHolder ViewHolder,int方向){
final int pos=viewHolder.getAdapterPosition();
如果(pos=mainList.size()){
返回;
}
删除主列表(pos);
AdapterRecyclServiceView.removeItem(位置);
adapterRecyclerView.notifyItemRemoved(pos);
AdapterRecyclView.notifyItemRangeChanged(pos,mainList.size());
}
@凌驾
公共布尔值isLongPressDragEnabled(){
返回true;
}
@凌驾
公共布尔值IsItemViewSwipEnabled(){
返回true;
}
};
ItemTouchHelper ItemTouchHelper=新的ItemTouchHelper(回调);
itemTouchHelper.attachToRecyclerView(播放循环视图);
}
问题

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

  • 未调用用于拖放(重新排列项目)的ItemTouchHelper的OnMove()方法


  • 您是否尝试过notifydatasetchanged()?已经尝试过,但没有成功。@AliAsheer所有这些都已经写入了一个愚蠢的建议所给出的代码中,但我最终解决了您的问题,因为我也遇到了同样的问题。拖动项目时,只需在拖动之前长按项目。代码本身看起来不错。您是否尝试过notifydatasetchanged()?已经尝试过了,但没有成功。@AliAsheer所有这些都已经写入了一个愚蠢的建议所给出的代码中,但我最终解决了您的问题,因为我也遇到了同样的问题。拖动项目时,只需在拖动之前长按项目。代码本身看起来不错。