RecyclerView Item Android Studio的弹出菜单功能

Posted

技术标签:

【中文标题】RecyclerView Item Android Studio的弹出菜单功能【英文标题】:Pop up Menu functions for ReyclerView Item Android Studio 【发布时间】:2019-12-26 21:08:37 【问题描述】:

我正在使用调用与数据库交互的后端 API 的弹出菜单为我的 ReyclerView 实现取消和启用功能。 API 工作正常。但是,这些函数会更新列表中的最后一项,而不是选定的一项。我该怎么办?

我尝试从模型定义中获取 ID,但也失败了。它返回最后一个项目的 Id。

public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position)

    // Get current position of item in recyclerview to bind data and assign values from list
    final MyHolder myHolder= (MyHolder) holder;
    current = dataErrand.get(position);
    myHolder.service.setText(current.errandservice);
    myHolder.date.setText("Date: " + current.erranddate);
    myHolder.time.setText("Time: " + current.errandtime);
    myHolder.phone.setText("Phone: " + current.errandphone);
    myHolder.location.setText("Location: " + current.errandlocation);
    myHolder.status.setText("status: " + current.errandstatus);
    myHolder.id.setText("Id: "+current.getErrandid());
    myHolder.options.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            PopupMenu popup = new PopupMenu(context, myHolder.options);
            popup.inflate(R.menu.errand_options);
            Menu popMenu = popup.getMenu();
            if(current.errandstatus == "Active")
                popMenu.findItem(R.id.errand_reactivate).setVisible(false);
                popMenu.findItem(R.id.errand_cancel).setVisible(true);
            
            if (current.errandstatus == "Canceled")
                popMenu.findItem(R.id.errand_cancel).setVisible(false);
                popMenu.findItem(R.id.errand_reactivate).setVisible(true);
            
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() 
                @Override
                public boolean onMenuItemClick(MenuItem item) 
                    int menuId = item.getItemId();
                        if(menuId == R.id.errand_cancel)
                            //handle menu1 click
                            //return true;
                            Toast.makeText(context, " "+current.getErrandid(), Toast.LENGTH_LONG).show();
                            changeStatus = new ChangeStatus(context);
                            isChanged = changeStatus.makeChange(current.errandid,0 );
                            if(isChanged == true)
                                current.errandstatus = "Canceled";
                                myHolder.status.setText("status: " + current.errandstatus);
                            
                            //return true;
                        
                        if(menuId ==R.id.errand_reactivate)
                            Toast.makeText(context, " "+current.getErrandid(), Toast.LENGTH_LONG).show();
                            changeStatus = new ChangeStatus(context);
                            isChanged = changeStatus.makeChange(current.errandid, 1);
                            if(isChanged == true)
                                current.errandstatus = "Active";
                                myHolder.status.setText("status: " + current.errandstatus);
                            
                            //return  true;
                        
                    return false;
                
            );
            popup.show();
        
    );

OnMenuItemClick 应该转发 Item Id 和预期的变化;作为激活的 1 和取消的 2,到后端 API。在此处输入图像描述

【问题讨论】:

【参考方案1】:

您的current 变量将在每次onBindViewHolder 调用时被覆盖。 您应该将 id 与您的 ViewHolder 一起存储,例如:

    holder.options.setTag(position);

然后在onclick方法中检索位置例如:

    int pos = (int) v.getTag(); 

希望对你有帮助。

【讨论】:

以上是关于RecyclerView Item Android Studio的弹出菜单功能的主要内容,如果未能解决你的问题,请参考以下文章

Android教程2020 - RecyclerView显示多种item

android中RecyclerView嵌套问题中,内层RecyclerView区域无法响应Item点击事件

android RecyclerView获得单个Item的ViewHolder

Android-RecyclerView系列 RecyclerView实现Item居中效果

Android RecyclerView 监听Item短按和长按

android RecyclerView获得单个Item的ViewHolder