OptionsMenu和ContextMenu的使用(二)——针对ListView和RecyclerView

一、ListView使用ContextMenu

给ListView添加OnCreateContextMenuListener,源代码如下所示:
lv.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
            @Override
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                menu.setHeaderTitle("listView");
                menu.setHeaderIcon(R.mipmap.ic_launcher_round);
                menu.add(0, Menu.FIRST + 1, 1, "listViewListener1");
                menu.add(0, Menu.FIRST + 2, 2, "listViewListener2");
                menu.add(0, Menu.FIRST + 3, 3, "listViewListener3");
                menu.add(0, Menu.FIRST + 4, 4, "listViewListener4");
            }
        });

1.1 长按效果实现

效果图如下所示:

针对ListView长按事件的源代码处理如下所示:

 //设置条目的长按事件
        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MenuListenerActivity.this, dataLists.get(position), Toast.LENGTH_SHORT).show();
                //返回false将会继续触发显示上下文菜单的逻辑,返回true将不会触发该逻辑了
                return false;
            }
        });

1.2 单击效果实现

效果图如下所示:

针对ListView单击事件的源代码处理如下所示:

//设置条目点击事件
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                view.showContextMenu();
            }
        });

二、RecyclerView使用ContextMenu

给RecyclerView添加OnCreateContextMenuListener,源代码如下所示:
rv.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
            @Override
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
                menu.setHeaderTitle("recyclerView");
                menu.setHeaderIcon(R.mipmap.ic_launcher_round);
                menu.add(0, Menu.FIRST + 1, 1, "recyclerViewListener1");
                menu.add(0, Menu.FIRST + 2, 2, "recyclerViewListener2");
                menu.add(0, Menu.FIRST + 3, 3, "recyclerViewListener3");
                menu.add(0, Menu.FIRST + 4, 4, "recyclerViewListener4");
            }
        });
由于RecyclerView是直接继承至ViewGroup的,它不像是AbsListView及其子类。 它没有创建AdapterView.AdapterContextMenuInfo,所以需要重写getContextMenuInfo 和 showContextMenuForChild。 重写RecyclerView代码如下所示:
package org.chromium.chrome.browser.androridmenudemo;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;

public class RecyclerViewImplementsContextMenu extends RecyclerView {
    private AdapterView.AdapterContextMenuInfo contextMenuInfo;
    public RecyclerViewImplementsContextMenu(Context context) {
        super(context);
    }

    public RecyclerViewImplementsContextMenu(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public RecyclerViewImplementsContextMenu(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    //重写方法一
    @Override
    public AdapterView.AdapterContextMenuInfo getContextMenuInfo() {
        return contextMenuInfo;
    }

    //重写方法二
    @Override
    public boolean showContextMenuForChild(View originalView) {
        int position = getChildAdapterPosition(originalView);
        long longId = getChildItemId(originalView);
        contextMenuInfo = new AdapterView.AdapterContextMenuInfo(originalView, position, longId);
        return super.showContextMenuForChild(originalView);
    }
}

2.1 长按效果实现

效果图如下所示:

针对RecyclerVIew长按事件的源代码处理如下所示:

 //添加长按事件
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(context, list.get(position), Toast.LENGTH_SHORT).show();
                return false;
            }
        });

2.2 单击效果实现

效果图如下所示:

针对RecyclerView单击事件的源代码处理如下所示:

//添加单击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.showContextMenu();
            }
        });

其实RecyclerView对于条目的长按效果和单击效果都是借助其Adapter实现的,Adapter的具体实现如下所示:

package org.chromium.chrome.browser.androridmenudemo;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

class RvAdapter extends RecyclerView.Adapter<RvAdapter.RvHolder> {
    private final Context context;
    private final List<String> list;

    public RvAdapter(Context context, List<String> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public RvAdapter.RvHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
        return new RvHolder(inflate);
    }

    @Override
    public void onBindViewHolder(RvAdapter.RvHolder holder, final int position) {
        TextView text1 = holder.getText1();
        text1.setText(list.get(position));
        //添加单击事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.showContextMenu();
            }
        });

        //添加长按事件
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(context, list.get(position), Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }

    @Override
    public int getItemCount() {
        return list != null ? list.size() : 0;
    }

    public class RvHolder extends RecyclerView.ViewHolder {

        private final TextView text1;

        public RvHolder(View itemView) {
            super(itemView);
            text1 = itemView.findViewById(android.R.id.text1);
            // 在不给各个条目添加长按事件的情况下,如下代码必须添加否则ContextMenu是弹不出来的
            // itemView.setLongClickable(true);
        }

        public TextView getText1() {
            return text1;
        }
    }
}

参考文章

为RecycleView添加ContextMenu支持

源码地址

OptionsMenu和ContextMenu相关博客的DEMO源码

猜你喜欢

转载自blog.csdn.net/Duckdan/article/details/81702587