一、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;
}
}
}