当用户长按列表项时,我的应用程序将ListPopupWindow显示为上下文菜单。显示上下文菜单后,仍然可以拖动背景,直到用户抬起手指为止。您可以在附加的gif中查看行为。我想知道如何控制这种拖拉。
TrackListAdapter.java:
private final float[] longClickLastTouchDownXY = new float[2];
@Override
@CallSuper
public void onBindViewHolder(VH holder, int position) {
holder.itemView.setOnTouchListener((v, event) -> {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
longClickLastTouchDownXY[0] = event.getX();
longClickLastTouchDownXY[1] = event.getY();
}
return false;
});
holder.itemView.setOnLongClickListener(v -> {
if (onItemLongClickListener != null) {
onItemLongClickListener.onItemLongClick((ViewGroup) v,
(int) longClickLastTouchDownXY[0], (int) longClickLastTouchDownXY[1],
holder.getAdapterPosition());
return true;
}
return false;
});
}
TrackListFragment.java:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.list_track, container, false);
ButterKnife.bind(this, layout);
tracksList.setAdapter(tracksAdapter);
tracksAdapter.setOnItemLongClickListener(this::showTrackContextMenu);
return layout;
}
private void showTrackContextMenu(ViewGroup rootView, float x, float y, int itemPosition) {
Track selectedTrack = tracksAdapter.get(itemPosition);
ListPopupWindow popupWindow = new ListPopupWindow(requireContext());
ListPopupWindowAdapter adapter = new ListPopupWindowAdapter(requireContext(), R.menu.track_menu);
popupWindow.setAdapter(adapter);
View tempView = new View(requireContext());
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(0, 0);
tempView.setLayoutParams(lp);
tempView.setX(x - rootView.getPaddingLeft());
tempView.setY(y - rootView.getPaddingTop());
rootView.addView(tempView);
popupWindow.setAnchorView(tempView);
popupWindow.setModal(true);
popupWindow.setOnDismissListener(() -> rootView.removeView(tempView));
popupWindow.show();
}
用于冻结RecyclerView的垂直滚动条:
RecyclerView有一个称为setLayoutFrozen(boolean frozen);
的方法,该方法似乎在RecyclerView处于活动状态(将frozen
设置为true时)会阻止它的TouchEvent。
现在,我假设当您长单击列表中的一个项目时(似乎您为此创建了一个接口),将调用您的方法showTrackContextMenu(.....)
。无论如何,请尝试在此方法结束时冻结RecyclerView。像这样:
private void showTrackContextMenu(ViewGroup rootView, float x, float y, int itemPosition) {
.......
.......
.......
popupWindow.show();
//here
yourRecyclerView.setLayoutFrozen(true);
}
如果要删除冻结,以便再次滚动,只需调用此:
yourRecyclerView.setLayoutFrozen(false);
用于冻结ViewPager:
好吧,我找不到一种冻结ViewPager的方法,您唯一能做的就是制作一个自定义ViewPager并使用它来做您想要的事情:
class MyViewPager extends ViewPager{
private boolean frozen = false;
public MyViewPager(Context context){
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void freezeViewPager(boolean frozen){
this.frozen = frozen;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(frozen){
return false;
}else{
return super.onTouchEvent(event);
}
}
}
然后您在xml中使用上述ViewPager,而不是所使用的默认ViewPager。
冻结:
.......
popupWindow.show();
//here recyclerView
yourRecyclerView.setLayoutFrozen(true);
//here view pager
myViewPager.freezeViewPager(true);
要停止冻结:
myViewPager.freezeViewPager(false);