在 android 中自定义 RecyclerView 上的溢出菜单

Customizing Overflow menu on a RecyclerView in android

我正在关注与此类似的项目:http://www.javatpoint.com/android-popup-menu-example

我已经在我的 recyclerView 中的每个项目上创建了溢出菜单。菜单正常出现。我创建了名为下载的菜单项,以及另一个名为取消下载的菜单项。像这样:

popup.xml(菜单文件夹内)

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/video_download"
        android:title="Download"/>

    <item
        android:id="@+id/video_download_cancel"
        android:title="Cancel Download"
        android:visible="false"/>
</menu>

弹出菜单正常显示,没有任何问题。

现在的问题是:

点击下载我想隐藏 video_downloadvideo_download_cancel可见。

这可能吗?

这是我创建的溢出菜单(三个垂直点)的点击事件:

personViewHolder.video_menu.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                final PopupMenu popup = new PopupMenu(mContext, v);
                popup.getMenuInflater().inflate(R.menu.popmenu, popup.getMenu());
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
                {
                    @Override
                    public boolean onMenuItemClick(MenuItem item)
                    {
                        Intent intent = new Intent(mContext, Download_Service.class);
                        intent.putExtra("link", urlstring);
                        mContext.startService(intent);

                        return true;
                    }

                });

                popup.show();
            }
        });

其中 video_menu 是图像(垂直三点)。

试试这个:

popup.getMenu().getItem(0).setVisible(false);

获取 Menu 的实例并获取第一项并使其成为 visible/invisible。

您似乎永远不会同时显示 "download" 和 "cancel download" 项。那么为什么不制作两个单独的菜单布局,并通过保持下载过程的状态在正确的菜单布局上膨胀。如果正在进行下载,只需使用 "cancel download" 项填充布局,如果没有下载,则使用 "download" 项填充布局。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/video_download_cancel"
        android:title="Cancel Download"
        android:visible="false"/>
</menu>

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/video_download"
        android:title="Download"/>
</menu>

这是两个菜单项布局。

personViewHolder.video_menu.setOnClickListener(new MyOnClickListener(this));

private final class MyOnClickListener implements View.OnClickListener {
    private final Context mContext;
    private boolean mDownloading = false;
    public MyOnClickListener(Context context) {
        mContext = context;
    }
    @Override
    public void onClick(View v)
    {
        final PopupMenu popup = new PopupMenu(mContext, v);
        if (mDownloading) {
            popup.getMenuInflater().inflate(R.menu.popmenu_canceldownload, popup.getMenu());
        } else {
            popup.getMenuInflater().inflate(R.menu.popmenu_download, popup.getMenu());
        }
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
        {
            @Override
            public boolean onMenuItemClick(MenuItem item)
            {
                if (!mDownloading) {
                    Intent intent = new Intent(mContext, Download_Service.class);
                    intent.putExtra("link", urlstring);
                    mContext.startService(intent);

                    MyOnClickListener.this.mDownloading = true;
                } else {
                    // Cancel download
                    MyOnClickListener.this.mDownloading = false;
                }
                return true;
            }
        });
        popup.show();
    }
}