Android recyclerView Adapter 弹出菜单不工作

Android recyclerView Adapter Popup menu not working

我正在尝试制作一个笔记应用程序,并且我已经获得了要在回收站中列出的项目(笔记)。每个项目上都有一个 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_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="2dp"
    card_view:cardElevation="0dp"
    android:clickable="true"
    android:layout_margin="5dp">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="@drawable/note_shape"
            android:padding="3dp">

            <TextView
                android:textColor="@color/primaryText"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                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_width="20dp"
                android:layout_height="match_parent"
                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_height="wrap_content"
                android:layout_width="wrap_content"
                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_width="fill_parent"
            android:layout_height="5dp"
            android:id="@+id/progressBar"
            android:max="100"
            android:progressDrawable="@drawable/progress_color"
            android:background="#ffffff" />

    </LinearLayout>

回收器适配器(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 Class (noteClickListener.java):

import android.view.View;

public interface noteClickListener {
    void onNoteItemClick(View v, int position);
}

您需要创建一些 /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);

来扩充菜单

您必须只更换 holder.optionBtn 有风景

PopupMenu popupMenu = new PopupMenu(context,view);

你的代码开始工作了。