Android 包含RecyclerView和CardView的ContextMenu
我想在recyclerview的cardview项目上有一个上下文菜单 并没有真正提供解决方案 我可以在ViewHolder上创建OnClickListener和OnLongClickListener。我也可以放入OnCreateContextMenu,但从来没有调用过OnCreateContextMenu 有人能举个例子吗 大家好, 您不能直接实现这些方法,如onClickListener, OnContextMenuListener等,因为RecycleView扩展了android.view.ViewGroup 所以我们不能直接使用这些方法。 我们可以在ViewHolder适配器类中实现这些方法。 我们可以像这样在RecycleView中使用上下文菜单 现在,我们在实现上下文菜单时遵循相同的过程Android 包含RecyclerView和CardView的ContextMenu,android,contextmenu,android-recyclerview,Android,Contextmenu,Android Recyclerview,我想在recyclerview的cardview项目上有一个上下文菜单 并没有真正提供解决方案 我可以在ViewHolder上创建OnClickListener和OnLongClickListener。我也可以放入OnCreateContextMenu,但从来没有调用过OnCreateContextMenu 有人能举个例子吗 大家好, 您不能直接实现这些方法,如onClickListener, OnContextMenuListener等,因为RecycleView扩展了android.view
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 0, "Call");//groupId, itemId, order, title
menu.add(0, v.getId(), 0, "SMS");
}
如果你遇到任何困难,请发表评论 如果您没有设置长时间单击侦听器,菜单将在长时间单击事件时打开,并显示:
public static class MyViewHolder extends RecyclerView.ViewHolder
implements View.OnCreateContextMenuListener, View.OnClickListener,
MenuItem.OnMenuItemClickListener {
MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
MenuItem myActionItem = menu.add("Some menu item");
myActionItem.setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
// Menu Item Clicked!
return true;
}
}
我可能会迟到,但我有一个有效的解决办法。我已经为它做了一个要点 将上下文菜单添加到RecyclerView ActivityName.java
//Import Statements
public class ActivityName extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_birthdays);
//Recycle View
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mLayoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new BirthdaysListAdapter(data, this);
mRecyclerView.setAdapter(mAdapter);
}
//Import Statements
public class BirthdaysListAdapter extends RecyclerView.Adapter<BirthdaysListAdapter.ViewHolder> {
static Context ctx;
private List<typeOfData> Data;
public BirthdaysListAdapter(List<typeOfData> list, Context context) {
Data = list;
this.ctx = context;
}
BirthdaysListAdapter() {
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
public TextView name;
public TextView Birthday;
public ImageView colorAlphabet;
public TextView textInImg;
public ViewHolder(View v) {
super(v);
name = (TextView) v.findViewById(R.id.name);
Birthday = (TextView) v.findViewById(R.id.Birthday);
colorAlphabet = (ImageView) v.findViewById(R.id.colorAlphabet);
textInImg = (TextView) v.findViewById(R.id.textInImg);
v.setOnCreateContextMenuListener(this); //REGISTER ONCREATE MENU LISTENER
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v //CREATE MENU BY THIS METHOD
ContextMenu.ContextMenuInfo menuInfo) {
new BirthdaysListAdapter().info = (AdapterView.AdapterContextMenuInfo) menuInfo;
MenuItem Edit = menu.add(Menu.NONE, 1, 1, "Edit");
MenuItem Delete = menu.add(Menu.NONE, 2, 2, "Delete");
Edit.setOnMenuItemClickListener(onEditMenu);
Delete.setOnMenuItemClickListener(onEditMenu);
}
//ADD AN ONMENUITEM LISTENER TO EXECUTE COMMANDS ONCLICK OF CONTEXT MENU TASK
private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
DBHandler dbHandler = new DBHandler(ctx);
List<WishMen> data = dbHandler.getWishmen();
switch (item.getItemId()) {
case 1:
//Do stuff
break;
case 2:
//Do stuff
break;
}
return true;
}
};
}
public List<ViewBirthdayModel> getData() {
return Data;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_view_birthdays, parent, false);
ViewHolder vh = new ViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.name.setText(Data.get(position).getMan().getName());
holder.Birthday.setText(Data.get(position).getMan().getBday());
holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position).getColor()));
holder.textInImg.setText(String.valueOf(Data.get(position).getMan().getName().toUpperCase().charAt(0)));
}
@Override
public int getItemCount() {
return Data.size();
}
private int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
}
RecyclerAdapter.java
//Import Statements
public class ActivityName extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_birthdays);
//Recycle View
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mLayoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new BirthdaysListAdapter(data, this);
mRecyclerView.setAdapter(mAdapter);
}
//Import Statements
public class BirthdaysListAdapter extends RecyclerView.Adapter<BirthdaysListAdapter.ViewHolder> {
static Context ctx;
private List<typeOfData> Data;
public BirthdaysListAdapter(List<typeOfData> list, Context context) {
Data = list;
this.ctx = context;
}
BirthdaysListAdapter() {
}
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
public TextView name;
public TextView Birthday;
public ImageView colorAlphabet;
public TextView textInImg;
public ViewHolder(View v) {
super(v);
name = (TextView) v.findViewById(R.id.name);
Birthday = (TextView) v.findViewById(R.id.Birthday);
colorAlphabet = (ImageView) v.findViewById(R.id.colorAlphabet);
textInImg = (TextView) v.findViewById(R.id.textInImg);
v.setOnCreateContextMenuListener(this); //REGISTER ONCREATE MENU LISTENER
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v //CREATE MENU BY THIS METHOD
ContextMenu.ContextMenuInfo menuInfo) {
new BirthdaysListAdapter().info = (AdapterView.AdapterContextMenuInfo) menuInfo;
MenuItem Edit = menu.add(Menu.NONE, 1, 1, "Edit");
MenuItem Delete = menu.add(Menu.NONE, 2, 2, "Delete");
Edit.setOnMenuItemClickListener(onEditMenu);
Delete.setOnMenuItemClickListener(onEditMenu);
}
//ADD AN ONMENUITEM LISTENER TO EXECUTE COMMANDS ONCLICK OF CONTEXT MENU TASK
private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
DBHandler dbHandler = new DBHandler(ctx);
List<WishMen> data = dbHandler.getWishmen();
switch (item.getItemId()) {
case 1:
//Do stuff
break;
case 2:
//Do stuff
break;
}
return true;
}
};
}
public List<ViewBirthdayModel> getData() {
return Data;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_view_birthdays, parent, false);
ViewHolder vh = new ViewHolder(view);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
holder.name.setText(Data.get(position).getMan().getName());
holder.Birthday.setText(Data.get(position).getMan().getBday());
holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position).getColor()));
holder.textInImg.setText(String.valueOf(Data.get(position).getMan().getName().toUpperCase().charAt(0)));
}
@Override
public int getItemCount() {
return Data.size();
}
private int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
}
//导入语句
公共类BirthdaysListAdapter扩展了RecyclerView.Adapter{
静态上下文ctx;
私人名单数据;
公共生日sListAdapter(列表、上下文){
数据=列表;
this.ctx=上下文;
}
生日SlistAdapter(){
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnCreateContextMenuListener{
公共文本视图名称;
公共文本查看生日;
公共图像视图彩色字母表;
公共文本视图文本输入;
公共视图持有者(视图v){
超级(五);
name=(TextView)v.findViewById(R.id.name);
生日=(文本视图)v.findviewbyd(R.id.birth);
colorAlphabet=(ImageView)v.findViewById(R.id.colorAlphabet);
textInImg=(TextView)v.findViewById(R.id.textInImg);
v、 setOnCreateContextMenuListener(this);//注册ONCREATE菜单侦听器
}
@凌驾
public void onCreateContextMenu(ContextMenu,View v//CREATE menu)使用此方法
ContextMenu.ContextMenuInfo menuInfo){
new BirthdaysListAdapter().info=(AdapterView.AdapterContextMenuInfo)菜单信息;
MenuItem Edit=menu.add(menu.NONE,1,1,“编辑”);
MenuItem Delete=menu.add(menu.NONE,2,2,“Delete”);
编辑.setOnMenuItemClickListener(OneEdit菜单);
Delete.setOnMenuItemClickListener(onEditMenu);
}
//添加ONMENUITEM侦听器,以便在单击上下文菜单任务时执行命令
private final MenuItem.OnMenuItemClickListener onEditMenu=新建MenuItem.OnMenuItemClickListener(){
@凌驾
公共布尔onMenuItemClick(菜单项){
DBHandler=newdbhandler(ctx);
List data=dbHandler.getWishman();
开关(item.getItemId()){
案例1:
//做事
打破
案例2:
//做事
打破
}
返回true;
}
};
}
公共列表getData(){
返回数据;
}
@凌驾
公共长getItemId(int位置){
返回super.getItemId(位置);
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.row\u View\u birthdays,parent,false);
ViewHolder vh=新的ViewHolder(视图);
返回vh;
}
@凌驾
公共无效onBindViewHolder(最终ViewHolder,内部位置){
holder.name.setText(Data.get(position.getMan().getName());
holder.birth.setText(Data.get(position.getMan().getBday());
holder.colorAlphabet.setBackgroundColor(Color.parseColor(Data.get(position.getColor()));
holder.textInImg.setText(String.valueOf(Data.get(position.getMan().getName().toUpperCase().charAt(0));
}
@凌驾
public int getItemCount(){
返回Data.size();
}
私人职位;
public int getPosition(){
返回位置;
}
公共无效设置位置(内部位置){
这个位置=位置;
}
}
如果您想避免在适配器内手动编程定义上下文菜单,则可以使用弹出式菜单,并从正确的menu.xml将其充气
下面的示例正是这样做的,并允许您传入一个侦听器,该侦听器将在您的活动或片段中接收select和menu项,这些活动或片段首先设置此RecyclerView
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private List<CustomObject> objects;
private OnItemSelectedListener listener;
private final boolean withContextMenu;
class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnCreateContextMenuListener, PopupMenu.OnMenuItemClickListener {
@BindView(R.id.custom_name)
TextView name;
@BindView(R.id.custom_value)
TextView value;
ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
view.setOnClickListener(this);
if (withContextMenu) {
view.setOnCreateContextMenuListener(this);
}
}
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (listener != null) {
listener.onCustomerSelected(objects.get(position));
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
PopupMenu popup = new PopupMenu(v.getContext(), v);
popup.getMenuInflater().inflate(R.menu.custom_menu, popup.getMenu());
popup.setOnMenuItemClickListener(this);
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (listener != null) {
CustomObject object = objects.get(getAdapterPosition());
listener.onCustomerMenuAction(object, item);
}
return false;
}
}
public CustomerAdapter(List<CustomObject> objects, OnItemSelectedListener listener, boolean withContextMenu) {
this.listener = listener;
this.objects = objects;
this.withContextMenu = withContextMenu;
}
public interface OnItemSelectedListener {
void onSelected(CustomObject object);
void onMenuAction(CustomObject object, MenuItem item);
}
@Override
public CustomerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.snippet_custom_object_line, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
CustomObject object = objects.get(position);
holder.name.setText(object.getName());
holder.value.setText(object.getValue());
}
@Override
public int getItemCount() {
return objects.size();
}
}
公共类CustomAdapter扩展了RecyclerView.Adapter{
私有列表对象;
私密的被选中的监听器;
私有最终布尔值与上下文菜单;
类ViewHolder扩展了RecyclerView.ViewHolder
实现View.OnClickListener、View.OnCreateContextMenuListener、PopupMenu.OnMenuItemClickListener{
@BindView(R.id.custom\u名称)
文本视图名称;
@BindView(R.id.custom_值)
文本视图值;
视图保持器(视图){
超级(视图);
ButterKnife.bind(这个,视图);
view.setOnClickListener(这个);
如果(使用上下文菜单){
view.setOnCreateContextMenuListener(此);
}
}
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
if(侦听器!=null){
onCustomerSelected(objects.get(position));
}
}
@凌驾
public void onCreateContextMenu(ContextMenu菜单,视图v,ContextMenu.ContextMenuInfo菜单信息){
PopupMenu popup=新的PopupMenu(v。