当前位置: 首页 > 知识库问答 >
问题:

RecyclerView中的弹出菜单查看不同项目中的工作

韩高峯
2023-03-14

我有RecyclerView和信息旁边的每个项目都有一个按钮,三个点代表一个弹出菜单。当用户点击该按钮时,弹出菜单将显示更多信息。项目的某些部分变得可见。我不能使用一次性回收工具,我必须用这个。但问题是,当我点击它时,它只会展开和折叠我的RecyclerView上的最后一个项目,而不是点击的项目。我试过这样做:为RecyclerView项目创建选项菜单,并结合其他解决方案。我的代码就是基于这个问题编写的。

我的代码:

 @Override
    public void onBindViewHolder(@NonNull AccountsHolder holder, int position) {
        AccountsModel model = list.get(position);
        holder.bind(model);
        holder.binding.moreInfoIB.setOnClickListener(v -> {
            //creating a popup menu
            PopupMenu popup = new PopupMenu(context, v);
            //inflating menu from xml resource
            popup.inflate(R.menu.assets_more_info_menu);
            popup.setOnMenuItemClickListener(item -> {
                Log.i("ItemID: ", String.valueOf(item.getItemId()));
                if (item.getItemId() == R.id.item1) {
                    if (isExpanded) {
                        collapse(group);
                        isExpanded = false;

                    } else {
                        isExpanded = true;
                        expand(group);

                    }
                } else {
                    return false;
                }
                return true;
            });
            //displaying the popup
            popup.show();
        });

    }

编辑我的整个适配器类:'

public class CashAccAdapter extends RecyclerView.Adapter<CashAccAdapter.AccountsHolder> {
    private List<AccountsModel> list;
    private Context context;
    private boolean isExpanded;
    private Group group;
    //SparseBooleanArrays map integers to booleans.
    private SparseBooleanArray expandedList = new SparseBooleanArray();

    public CashAccAdapter(List<AccountsModel> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @NonNull
    @Override
    public AccountsHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        ItemDetailedListAssetsBinding binding = ItemDetailedListAssetsBinding.inflate(layoutInflater, parent, false);
        group = binding.group;
        return new AccountsHolder(binding);
    }

    @Override
    public void onBindViewHolder(@NonNull AccountsHolder holder, int position) {
        AccountsModel model = list.get(position);
        holder.bind(model);
        holder.binding.moreInfoIB.setOnClickListener(v -> {
            //creating a popup menu
            PopupMenu popup = new PopupMenu(context, v);
            //inflating menu from xml resource
            popup.inflate(R.menu.assets_more_info_menu);
            popup.setOnMenuItemClickListener(item -> {
                Log.i("ItemID: ", String.valueOf(item.getItemId()));
                if (item.getItemId() == R.id.item1) {
                    if (expandedList[position]) {
                        collapse(group);
                        expandedList[position] = false;

                    } else {
                        expandedList [position]= true;
                        expand(group);

                    }
                } else {
                    return false;
                }
                return true;
            });
            //displaying the popup
            popup.show();
        });

    }

    @Override
    public int getItemCount() {
        return list != null ? list.size() : 0;
    }

    class AccountsHolder extends RecyclerView.ViewHolder {

        private ItemDetailedListAssetsBinding binding;

        public AccountsHolder(@NonNull ItemDetailedListAssetsBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

        public void bind(final AccountsModel modelClass) {
            binding.setListAssets(modelClass);
            binding.executePendingBindings();

            binding.accNameValueTV.setText(modelClass.getAccName());
            binding.accTypeValueTV.setText(modelClass.getAccType());
            binding.accCurentValueTV.setText("$" + modelClass.getCurrentValue());
            binding.accNumberValueTV.setText(modelClass.getAccNumber());
        }

    }
}

`

共有1个答案

谢俊力
2023-03-14

声明名为expandedList的SparseBooleanArray,并将此部分更改为

popup.setOnMenuItemClickListener(item -> {
                Log.i("ItemID: ", String.valueOf(item.getItemId()));
                if (item.getItemId() == R.id.item1) {
                    if (expanded.get(position)) {
                        collapse(group);
                        expandedList.put(position, false);
                    } else {
                        expandedList.put(position, true);
                        expand(group);
                    }
                    this.notifyItemChanged(position);
                } else {
                    return false;
                }
                return true;
            });

只有最后一项更改,因为您使用的是单个isExpanded变量。因此,请尝试上面的代码。祝你好运

 类似资料:
  • 我试图从模型定义中获取Id,但也失败了。它返回了最后一项的Id。 public void onBindViewHolder(最终的recycerview.viewholder,int位置){ OnMenuItemClick应该转发项目Id和预期的更改;作为激活的1和取消的2,到后端api。在这里输入图像描述

  • 我有popupMenu和CheckBox。我需要将状态CheckBox写入布尔。此代码不工作: 这是错误: 致命的例外:主java。com上的lang.NullPointerException。亚历克斯。救命啊。根系活力。android上的OnOptions ItemSelected(RootsActivity.java:182)。应用程序。活动com上的onMenuItemSelected(Ac

  • 如何创建一个选项菜单,如以下屏幕截图: 点击RecyclerView项目的“更多”图标后,应打开选项菜单! 我的尝试是这样的: 但这会导致问题,因为如果我点击RecyclerView item More按钮,则会单击完整项目。。。 这是我的RecyclerViewOnTouchListener: 我没有发现任何类似的问题,所以我希望你能帮助我!

  • 我有一个弹出窗口,其中包含不同种类的内容,分为几个部分,点击一个按钮就会触发。我试图在此实现中公开适当的可访问性/aria语义。(它不是一个模式对话框,而是一个简单的就地弹出窗口)。根据我目前的研究,我认为这是有意义的: 触发按钮上的咏叹调展开 在触发按钮上 其他可选键盘可访问性 此菜单按钮实现示例:https://www.w3.org/TR/wai-aria-practices/examples

  • mui框架内置了弹出菜单插件,弹出菜单显示内容不限,但必须包裹在一个含.mui-popover类的div中,如下即为一个弹出菜单内容: <div id="popover" class="mui-popover"> <ul class="mui-table-view"> <li class="mui-table-view-cell"><a href="#">Item1</a></li

  • 这是我现在面临的一个奇怪的问题。从我的应用程序中,我从JSON文件中从链接中获取数据,然后用Volley解析它。现在我想在一个看起来不起作用的RecyclerView上显示数据,我很高兴我的代码很好,但是有些东西似乎不起作用,我找不到它。 这是活动代码 HomeActivity.java: 这是我从适配器中扩展的布局,并从JSON文件中设置数据 和适配器类相关的代码,我猜: @Override p