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适配器打造方法

错误 ANDROID STUDIO E/RecyclerView:未连接适配器;跳过布局

Android RecyclerView使用简述