我在Recyclerview的CardView中有一个溢出按钮。 每当我点击按钮时,我会显示一个popup菜单,但RecyclerView也会向下滚动一个项目。 任何人都可以帮我阻止这种不必要的滚动吗?
基本上我试图复制与Playstore中相同的溢出按钮行为。
布局:
适配器:
@Override public void onBindViewHolder(final TracksViewHolder tracksViewHolder, int i) { tracksViewHolder.imgBtnOverflow.setTag(i); tracksViewHolder.imgBtnOverflow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Creating the instance of PopupMenu final int position = (Integer) v.getTag(); PopupMenu popup = new PopupMenu(mContext,tracksViewHolder.imgBtnOverflow); //Inflating the Popup using xml file popup.getMenuInflater() .inflate(R.menu.popup_menu_overflow, popup.getMenu()); //registering popup with OnMenuItemClickListener popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { if(mPopUpClick!=null) mPopUpClick.actionOnPopUpItemClick(position,item,songs.get(position)); return true; } }); popup.show(); //showing popup menu } }); }
更新:遇到问题。当popup菜单显示时,它会向下滑动列表以显示整个下拉列表。 如何调整popup窗口以根据可用空间显示上/下?
尝试使用android.widget.PopupMenu而不是android.support.v7.widget.PopupMenu和Voila,它的工作原理。 这是支持库中的一个错误。 伟大的开发人员可以在这里确认一样吗?
您可以让您的AnchorView覆盖requestRectangleOnScreen()并返回false。 这将阻止任何父ScrollView滚动。
因此,在您的情况下, imgBtnOverflow将是一个自定义ImageButton ,如下所示:
/** * A custom {@link ImageButton} which prevents parent ScrollView scrolling when used as the * anchor for a {@link android.support.v7.widget.PopupMenu} */ public class NonScrollImageButton extends ImageButton { public NonScrollImageButton(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) { return false; } }
此处针对支持PopupMenu提出了一个问题: https : //code.google.com/p/android/issues/detail? id = 135439
我有同样的问题,我用这种方式:
mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false) { @Override public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate) { return false; } }; mRecyclerView.setLayoutManager(mLayoutManager);
RecyclerView用户layoutmanager来管理布局,所以我认为更改layoutmanger行为是bettor解决方案。
requestRectangleOnScreen不适用于我,在我的情况下,当show popupMenu没有调用requestRectangleOnScreen 。 我的解决方案是覆盖requestChildRectangleOnScreen ,并且返回false,运行良好。
public class PopupAncorRecyclerViewPager extends RecyclerView { @Override public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) { return false; } }