RecyclerView滑动和移动项目在Android中无法使用BottomSheetDialog
我想使用ItemTouchHelper类在RecyclerView中滑动和拖放项目。RecyclerView位于BottomSheetDialog内 以下是设置RecyclerView的代码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
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(播放循环视图);
}
问题
您是否尝试过notifydatasetchanged()?已经尝试过,但没有成功。@AliAsheer所有这些都已经写入了一个愚蠢的建议所给出的代码中,但我最终解决了您的问题,因为我也遇到了同样的问题。拖动项目时,只需在拖动之前长按项目。代码本身看起来不错。您是否尝试过notifydatasetchanged()?已经尝试过了,但没有成功。@AliAsheer所有这些都已经写入了一个愚蠢的建议所给出的代码中,但我最终解决了您的问题,因为我也遇到了同样的问题。拖动项目时,只需在拖动之前长按项目。代码本身看起来不错。