Android recyclerView 适配器弹出菜单不起作用
Posted
技术标签:
【中文标题】Android recyclerView 适配器弹出菜单不起作用【英文标题】:Android recyclerView Adapter Popup menu not working 【发布时间】:2016-07-24 16:21:00 【问题描述】:我正在尝试制作一个笔记应用程序,并且我已经获得了要在回收站中列出的项目(笔记)。每个项目上都有一个 ImageButton,我希望在单击它后出现一个 popUpMenu。
可以单击单个项目的 imageButton,但我无法为每个单个项目显示 popUpMenu。
如果有更好或替代的方式,那也很棒。
项目 XML (row_notes.xml):
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
card_view:cardCornerRadius="2dp"
card_view:cardElevation="0dp"
android:clickable="true"
android:layout_margin="5dp">
<LinearLayout
android:orientation="vertical"
android:layout_
android:layout_ >
<FrameLayout
android:layout_
android:layout_
android:layout_weight="1"
android:background="@drawable/note_shape"
android:padding="3dp">
<TextView
android:textColor="@color/primaryText"
android:layout_
android:layout_
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Note"
android:id="@+id/rowNoteTitle"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:paddingLeft="10dp"
android:textSize="20dp"
android:layout_gravity="top|left|center_vertical"
android:layout_marginTop="2dp" />
<ImageButton
android:layout_
android:layout_
android:id="@+id/rowNoteBtn"
android:layout_gravity="right|center_vertical"
android:background="@drawable/img_btn_shape"
android:src="@drawable/ic_dots_vertical_white_24dp" />
<TextView
android:textColor="@color/secondaryText"
android:layout_
android:layout_
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Note amount"
android:id="@+id/rowNoteAmount"
android:layout_alignParentTop="true"
android:textSize="12dp"
android:layout_gravity="left|bottom"
android:layout_marginLeft="20dp"
android:layout_marginTop="7dp" />
</FrameLayout>
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_
android:layout_
android:id="@+id/progressBar"
android:max="100"
android:progressDrawable="@drawable/progress_color"
android:background="#ffffff" />
</LinearLayout>
Recycler Adapter (nRecyclerAdapter.java) POPUPMENU 代码在这里:
public class nRecyclerAdapter extends RecyclerView.Adapter<nViewHolder>
private Context context;
private ArrayList<Note> notes;
public nRecyclerAdapter(Context context, ArrayList<Note> notes)
this.context = context;
this.notes = notes;
@Override
public nViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_notes, parent, false);
nViewHolder holder = new nViewHolder(v);
return holder;
@Override
public void onBindViewHolder(final nViewHolder holder, final int position)
holder.noteTitle.setText(notes.get(position).getNoteTitle());
holder.noteAmount.setText(notes.get(position).getNoteAmount());
holder.optionBtn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
//Toast.makeText(context, notes.get(position).getNoteTitle()+" click button works",Toast.LENGTH_SHORT).show();
PopupMenu popupMenu = new PopupMenu(context,holder.optionBtn);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
@Override
public boolean onMenuItemClick(MenuItem menuItem)
String option = menuItem.getTitle().toString();
Toast.makeText(context, notes.get(position).getNoteTitle(),Toast.LENGTH_SHORT).show();
if(option.matches("Edit"))
Toast.makeText(context, notes.get(position).getNoteTitle()+" Edit",Toast.LENGTH_SHORT).show();
else if(option.matches("Delete"))
Toast.makeText(context, notes.get(position).getNoteTitle()+" Delete",Toast.LENGTH_SHORT).show();
return true;
);
popupMenu.show();
);
//listener
holder.setItemClickListener(new noteClickListener()
@Override
public void onNoteItemClick(View v, int position)
Toast.makeText(context, notes.get(position).getNoteTitle(),Toast.LENGTH_SHORT).show();
);
@Override
public int getItemCount()
return notes.size();
public void updateData(ArrayList<Note> mNotes)
notes.clear();
notes.addAll(mNotes);
notifyDataSetChanged();
public void addItem(String title, String amount)
notes.add(new Note(title,amount));
notifyDataSetChanged();
public void removeItem(int position)
notes.remove(position);
notifyDataSetChanged();
ViewHolder (nViewHolder.java):
public class nViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
TextView noteTitle;
TextView noteAmount;
noteClickListener noteClickListener;
ImageButton optionBtn;
public nViewHolder(View itemView)
super(itemView);
optionBtn = (ImageButton) itemView.findViewById(R.id.rowNoteBtn);
noteTitle = (TextView) itemView.findViewById(R.id.rowNoteTitle);
noteAmount = (TextView) itemView.findViewById(R.id.rowNoteAmount);
optionBtn.setOnClickListener(this);
itemView.setOnClickListener(this);
public void setItemClickListener(noteClickListener nc)
this.noteClickListener = nc;
@Override
public void onClick(View view)
this.noteClickListener.onNoteItemClick(view,getLayoutPosition());
onClickListener 类(noteClickListener.java):
import android.view.View;
public interface noteClickListener
void onNoteItemClick(View v, int position);
【问题讨论】:
【参考方案1】:你需要创建一些/res/menu/popupmenu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Menu Item" />
</menu>
然后,在您的PopupMenu popupMenu = new PopupMenu(context,holder.optionBtn);
行下方,您需要使用popupMenu.inflate(R.menu.popupmenu);
填充菜单
【讨论】:
【参考方案2】:您只能更换
holder.optionBtn
有视图
PopupMenu popupMenu = new PopupMenu(context,view);
你的代码开始工作了。
【讨论】:
以上是关于Android recyclerView 适配器弹出菜单不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在我的 recyclerview 适配器类中实现 Android 底页
如何在 recyclerview 适配器中将动态视图添加到 android 布局
Android进阶之通用RecyclerView适配器打造方法
Android进阶之通用RecyclerView适配器打造方法