【问题标题】:How to get RecyclerView position from PopupMenu onMenuItemClick如何从 PopupMenu onMenuItemClick 获取 RecyclerView 位置
【发布时间】:2020-11-01 19:06:11
【问题描述】:

使用RecylcerView,我试图为列表中的每个项目创建一个弹出菜单,类似于:

创建弹出菜单很简单,但是如何获取onMenuItemClicked中点击项的位置呢?

public class Activity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {

    public void showPopupMenu(View v) {
        PopupMenu popupMenu = new PopupMenu(this, v);
        MenuInflater inflater = popupMenu.getMenuInflater();
        inflater.inflate(R.menu.edit_delete_menu, popupMenu.getMenu());
        popupMenu.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {

        //get position here from RecyclerView here?

        switch (item.getItemId()) {
            case R.id.edit:
            //Do position specific action
            break;
            case R.id.delete:
                //Do position specific action
                break;
        }
        return false;
    }


}

【问题讨论】:

    标签: android android-popupwindow


    【解决方案1】:

    好的,所以我(令人惊讶地)设法在这里回答了我自己的问题。

    为了使用PopupMenuonMenuItemClicked 内的RecylcerView 适配器获取位置,我创建了PopupMenu 的自定义实现。

    这样做可以在使用PopupMenu(例如displaying icons in your menus)时提供更大的灵活性。

    查看 Google 的 PopupMenu 源代码,并创建自己的源代码,类似于 MyPopupMenu 的代码完全相同,但您可以修改该类可以执行的某些实例。

    为了完成我的问题,我在RecyclerView.Adapter 的“更多”按钮中添加了一个OnClickListener。单击时,按钮调用一个接口方法,该方法同时传递按钮视图和适配器的当前位置。

    MyPopupMenu的自定义实现中,为每个构造函数添加一个int值的变量要求。还要在MyPopupMenu内的接口方法onMenuItemClick(MenuItem item, int position)中添加int position

    最后,在活动类中组装。

    public class MyActivity extends AppCompatActivity implements MyAdapter.OnItemEventListener, PopupMenu.OnMenuItemClickListener {
    
        @Override
        public void onMoreClicked(View v, int position) {
            MyPopupMenu popupMenu = new MyPopupMenu(this, v, position);
            MenuInflater inflater = popupMenu.getMenuInflater();
            inflater.inflate(R.menu.edit_delete_menu, popupMenu.getMenu());
            popupMenu.setOnMenuItemClickListener(this);
            popupMenu.show();
        }
    
        @Override
        public boolean onMenuItemClick(MenuItem item, int position) {
            switch (item.getItemId()) {
                case R.id.edit:
                    //Do position specific action with int position
                    break;
                case R.id.delete:
                    //Do position specific action with int position
                    break;
            }
            return false;
        }
    }
    
    class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        private final OnItemEventListener onItemEventListener;
    
        static class ViewHolder extends RecyclerView.ViewHolder {
            ImageButton more;
    
            ViewHolder(View v) {
                super(v);
                more = (ImageButton) v.findViewById(R.id.list_item_more_button);
            }
        }
    
        public NewGameAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
            final ViewHolder viewHolder = new ViewHolder(v);
    
            viewHolder.more.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onItemEventListener.onMoreClicked(viewHolder.more, viewHolder.getAdapterPosition());
                }
            });
    
            return viewHolder;
        }
    
        interface OnItemEventListener {
            void onMoreClicked(View v, int position);
        }
    }
    

    让我知道你们的想法!

    【讨论】:

    • 说真的,非常感谢您。我整天都在寻找一种简单的方法来实现这个确切的问题。
    【解决方案2】:

    首先,在您显示的代码 sn-p 中,它与可用图像无关。

    请提供您的 onBindViewHolder 代码。这就是菜单项的点击监听器应该设置的地方。

    【讨论】:

      【解决方案3】:

      你好亲爱的你需要在适配器中使用这种方式

        @Override
          public void onBindViewHolder(@NonNull final RecentPlayedAdapter.MyViewHolder holder, final int position) {
              holder.menudotes.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
      PopupMenu popupMenu=new PopupMenu(context, holder.menudotes, Gravity.START);
                          popupMenu.getMenuInflater().inflate(R.menu.popupmenu1,popupMenu.getMenu());
                          popupMenu.show();
                          popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                              @Override
                              public boolean onMenuItemClick(MenuItem item) {
                                  switch (item.getItemId()) {
                                      case R.id.download:
                                          Toast.makeText(context, "Download", Toast.LENGTH_SHORT).show();
                                          //Do position specific action with int position
                                          break;
                                      case R.id.playlist:
                                          //Do position specific action with int position
                                          Toast.makeText(context, "Playlist", Toast.LENGTH_SHORT).show();
      
                                          break;
                                      case R.id.share:
                                          //Do position specific action with int position
                                          Toast.makeText(context, "Share", Toast.LENGTH_SHORT).show();
      
      
                                          break;
                                  }
                                  return true;
                              }
                          });
          }
              });
          }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        相关资源
        最近更新 更多