【问题标题】:How to show a checked items as checked in Edit mode using a RecyclerView?如何使用 RecyclerView 在编辑模式下显示选中的项目?
【发布时间】:2019-02-22 10:42:47
【问题描述】:

我无法在我的应用程序中获取业务逻辑之一。 谁能帮帮我,我是android开发的新手。

顺便说一句,我正在使用 android recyclerview 显示项目列表,我需要显示已经检查的项目已标记为签入 recyclerview。

我正在从服务器获取检查项目: InterestsList:["古董-收藏","工艺品","划船"]

这些项目需要与我的 recyclerView ArrayList 或 Items 进行比较,如果这些项目在 recyclerview 中可用,我需要显示为选中的项目。

我怎样才能为此编写简单的逻辑?

strings ArrayList 包含 Recycler 物品列表数据,InterestsList 是被检查物品列表数据。

这是我的适配器类:

  @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.tvInterestName.setText(interests.get(position).getInterest().toString());

        List<String> strings = new ArrayList<>(interests.size());
        for (Interest object : interests) {
            strings.add(Objects.toString(object, null));
        }

        interestList = model.getInterests();

        System.out.println("LISTTTTTT @@@"+strings.toString());
        System.out.println("LISTTTTTT @@@"+interestList.size());

        for (int i = 0; i < strings.size(); i++) {
            for (int j = 0; j < interestList.size(); j++) {
                if(strings.get(i).equalsIgnoreCase(interestList.get(j))) {
                    holder.checkBox.setChecked(true);
                }
                else
                holder.checkBox.setChecked(false);
            }
        }



        //in some cases, it will prevent unwanted situations
        holder.checkBox.setOnCheckedChangeListener(null);

        //if true, your checkbox will be selected, else unselected
        holder.checkBox.setChecked(interests.get(position).isSelected());

        holder.cell.setOnClickListener(v ->
        {
            holder.checkBox.performClick();
        });

        if (interests.get(position).isSelected()) {
            holder.checkBox.setChecked(true);
        } else {
            holder.checkBox.setChecked(false);
        }

        holder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) ->
        {
            guestListener.OnMultipleGuestListener(position, isChecked);
        });

    }

在我的活动类中使用的多个选择项接口侦听器:

  @Override
    public void OnMultipleGuestListener(int position, boolean isChecked) {
        interestList.get(position).setSelected(isChecked);
        interestsAdapter.notifyDataSetChanged();
    }

需要换屏:

【问题讨论】:

  • 这里似乎有些混乱。请确认几件事。 “interests”是 List,其中 Interest 是对象(onBindViewHolder 中的第一行),list 是所有兴趣的列表,而 model.getInterests 是所选兴趣的 List。正确的??如果是,OnMultipleGuestListener 接口的第一行是什么意思
  • Interests 是 List ,它在适配器类中具有所有/全部兴趣项。 OnMultipleGuestListener 接口第一行中的interestList 是我保存到此列表中并发送到我的服务器的所选项目的新数组列表。它是根据我从将添加到列表的回收站项目中选择的位置添加的。跨度>

标签: java android


【解决方案1】:

当用户点击其他区域时,您也正在捕获事件,让我们只关注该区域并忽略点击复选框。

在 xml 文件中,将复选框设置为 clickable=false

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder  holder, int position) {
        String interest = interests.get(position).getInterest().toString();
        holder.tvInterestName.setText(interest);

        interestList = model.getInterests(); //assuming it's list of string from your code

        //do not assign list from model here, instead do it on separate function 
        //of adapter because we do not need to resign same list every time to 
        //interestList from some other model which have nothing to do with each 
        //item. as this method will be called for each item

        final boolean isCheck = interestList.contain(interest);
        holder.checkBox.setChecked(isCheck);

        holder.cell.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                boolean isChecked = !holder.checkBox.isChecked();
                holder.checkBox.setChecked(isChecked );
                guestListener.OnMultipleGuestListener(position, isChecked);
            }
        });
    }

【讨论】:

  • 我正在通过多选界面使用多选。所以这段代码不允许我从 recyclerview 中选择多项。
  • 为什么?如果您使用的是 recyclerview.selection,那么跟踪器在哪里。我写的代码只是优化版本。让我知道,以便我可以提供帮助。 (y)
  • 这只是显示选中的列表,但我想再次选择其他项目并保存我编辑的列表。
  • @LaxmanLucky - 它也适用。在 guestListener 中,您将收到 checkchange 事件,因为我们在单元格布局上设置了 clickListener。
  • 我正在使用以下界面从 recyclerview 项目中选择多个项目:@Override public void OnMultipleGuestListener(int position, boolean isChecked) { interestList.get(position).setSelected(isChecked);兴趣适配器.notifyDataSetChanged(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2011-11-28
  • 1970-01-01
相关资源
最近更新 更多