【问题标题】:How do I get the id of checked checkboxes from recyclerview in android studio?如何从 android studio 中的 recyclerview 获取选中复选框的 id?
【发布时间】:2019-04-30 17:10:27
【问题描述】:

我有一个带有几个复选框的循环视图。从 API 接收的复选框的文本和 id。我应该将选中复选框的 id 发送到 API。现在,我有两个问题:

  • 如何获取选中的复选框 ID 并存储在字符串值中?这个 该字符串必须在活动中使用。
  • 当用户点击复选框并选中此复选框时,复选框的 ID 保存 在字符串中。现在,用户后悔并取消选中复选框。在 String 中,复选框的 id 应该删除。

我的一个解决方案是:

  • 创建包含方法 get 和 set 的数据模型(Info_Checkbox) 身份证。
  • 创建 ArrayList。
  • 将选中的复选框 id 设置为此数组列表并使用此数组 将参数发送到服务器。

但是我的代码不正确!当我检查了许多复选框时,数组列表保存了最后一个复选框 id。你能帮帮我吗?

Context context;
public ArrayList<Info_Filter> items = new ArrayList<>();
public SparseBooleanArray array = new SparseBooleanArray();
public List<Info_Filter> orig;
public ArrayList<Info_Checkbox> checkboxes = new ArrayList<>();
private Info_Checkbox info_checkbox = new Info_Checkbox();
public AdapterRecyFilterGroup(Context context, ArrayList<Info_Filter> items) {
    this.context = context;
    this.items = items;
}
@NonNull
@Override
public SetViewHolderFilter onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.sample_filter_grouping, viewGroup, false);
    return new SetViewHolderFilter(view);
}
@Override
public void onBindViewHolder(@NonNull SetViewHolderFilter setViewHolderFilter, int i) {
    setViewHolderFilter.checkBox.setText(items.get(i).getName());
    if (array.get(i)) {
        setViewHolderFilter.checkBox.setChecked(true);
    } else {
        setViewHolderFilter.checkBox.setChecked(false);
    }
}
@Override
public int getItemCount() {
    return items == null ? 0 : items.size();
}

public class SetViewHolderFilter extends RecyclerView.ViewHolder {
    CheckBox checkBox;
    public SetViewHolderFilter(@NonNull final View itemView) {
        super(itemView);
        checkBox = itemView.findViewById(R.id.cb_filter);
        checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (array.get(getAdapterPosition())) {      //!checked
                    array.put(getAdapterPosition(), false);
                    info_checkbox.setId(items.get(getAdapterPosition()).getId());
                    checkboxes.remove(info_checkbox);
                } else {        //checked
                    array.put(getAdapterPosition(), true);
                    info_checkbox.setId(items.get(getAdapterPosition()).getId());
                    checkboxes.add(info_checkbox);
                }
                notifyDataSetChanged();
            }
        });
    }
}

在活动中:

private String getCheckboxes(ArrayList<Info_Checkbox> checkboxes) {

    String category = "";
    for (int i = 0; i < checkboxes.size(); i++) {
        category = checkboxes.get(i).getId() + "," + category;
    }
    Log.i("asfaf", category);
    checkboxes.clear();
    return category;
}

如果选中复选框的 id 为 {7,5},则此方法返回 {5,5}。

【问题讨论】:

  • 为什么不使用布尔值
  • 到目前为止你尝试了什么?
  • @NigamPatro 帖子已更新。
  • @sajjadjavadi 请检查我添加的答案。

标签: android checkbox


【解决方案1】:

您需要在适配器中维护一个选定项目列表。只需在 onCheckedChanged 侦听器列表中添加和删除项目。在单击提交或任何您想要的位置后,您可以从适配器中获取该列表并映射该列表并仅获取将成为您选择的 ID 列表的字符串列表。您可以将其加入一个以逗号分隔的字符串中。将列表 id 加入到字符串中,您可以。

TextUtils.join(",",[Your IDs list])

【讨论】:

  • 看看我的代码。我有一个数组列表。我的错在哪里?
【解决方案2】:

解决方案 1

在这里,您只创建了一个info_checkbox 的实例,并且每次都将相同的实例添加到列表中。这是一个问题。对于每个项目位置,您必须创建该类的一个实例并将其添加到列表中或从列表中删除。

解决方案 2

您可以遍历SparseBooleanArray对象,并根据您的数据中的位置从列表中获取项目并创建所需的数据。

【讨论】:

    【解决方案3】:

    你的错误是记录了CheckBox的id,而CheckBox被RecyclerView重用,即同一个CheckBox用于item 1,当item 1滚出屏幕,item 7进入屏幕时,同一个CheckBox绑定到第 7 项。

    因此,如果您选中第 1 项,然后滚动并选中第 7 项,在您的复选框中,您会得到两次相同的 id。

    查看您的代码,这些代码不是必需的:

    public ArrayList<Info_Checkbox> checkboxes = new ArrayList<>();
    private Info_Checkbox info_checkbox = new Info_Checkbox();
    
                    info_checkbox.setId(items.get(getAdapterPosition()).getId());
                    checkboxes.remove(info_checkbox);
    
                    info_checkbox.setId(items.get(getAdapterPosition()).getId());
                    checkboxes.add(info_checkbox);
    

    您可以从数组中获取检查项的索引,其中记录了哪些项被检查(检查数组中的真实项):

    public SparseBooleanArray array = new SparseBooleanArray();
    

    这将为您提供完整的检查项目:

    private String getCheckedItems() {
    
        String category = "";
        for (int i = 0; i < items.size(); i++) {
            if (array.get(i, false))
                category = category + String.valueOf(i) + ",";
        }
        Log.i("asfaf", category);
        return category;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2016-12-19
      • 2011-12-10
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      相关资源
      最近更新 更多