【问题标题】:When I try to remove an element from "UncheckedValues" -Arraylist it removes the element from "allValues" - Arraylist as well当我尝试从“UncheckedValues”-Arraylist 中删除一个元素时,它也会从“allValues”-Arraylist 中删除该元素
【发布时间】:2021-10-18 12:23:45
【问题描述】:

我正在使用复选框和微调器,您可以在其中选择如何过滤复选框。您有 3 个选项:

1 - “All”又名“Alle” -> 显示 all 复选框(选中和未选中

2 - “选中”又名“Vorhanden” -> 显示所有选中复选框

3 - “未检查”又名“Nicht vrhd”。 -> 显示所有未选中复选框

让我在我的适配器中显示必要的信息,我正在处理,首先:

SchrankAdapter:

public SchrankAdapter(Context context, ArrayList<CategoryName> categoryTopic, Map<String, String> dropDownValues, RelativeLayout parentLayout){

    this.context = context;
    this.categoryTopic = categoryTopic;
    this.uncheckedValues.addAll(categoryTopic);
    this.dropDownValues = dropDownValues;
    this.parentLayout = parentLayout;
    this.allValues.addAll(categoryTopic);

}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_schrank, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    CategoryName parentItem = categoryTopic.get(position);
    holder.categoryName.setText(parentItem.getCategoryName());

    setCatItemRecycler(holder.childRecView, parentItem.getChildViewList(), parentItem.getCategoryName());

}

private void setCatItemRecycler(RecyclerView recyclerView, ArrayList<CategoryChild> categoryChildrenList, String categoryName) {

    childAdapter = new SchrankChildAdapter(context, categoryChildrenList, categoryName, this, parentLayout);
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
    recyclerView.setAdapter(childAdapter);
}

public Filter getSpinnerFilter() {
    return spinnerFilter;
}

private Filter spinnerFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        ArrayList<CategoryName> filteredList = new ArrayList<>();

        if(constraint == null || constraint.length() == 0 || constraint.equals("all")) {

            filteredList.addAll(allValues);
            spinnerValue = "all";

        }  else if(constraint.equals("checked")) {

           filteredList.addAll(checkedValues);
           spinnerValue = "checked";

        } else if(constraint.equals("unchecked")) {

            filteredList.addAll(uncheckedValues);
            spinnerValue = "unchecked";
        }

        FilterResults results = new FilterResults();

        if(filteredList != null)
            results.values = sortEverything(filteredList);
        else
            results.values = allValues;

        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        categoryTopic.clear();
        categoryTopic.addAll((ArrayList) results.values);
        notifyDataSetChanged();

    }
};

public class ViewHolder extends RecyclerView.ViewHolder{

    TextView categoryName;
    RelativeLayout childView;
    RecyclerView childRecView;
    Button btFolderPlus, btFolderMinus;
    Spinner dropDownMenu;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        categoryName = itemView.findViewById(R.id.categoryName);
        childView = itemView.findViewById(R.id.childView);
        childRecView = itemView.findViewById(R.id.childRecView);
        btFolderPlus = itemView.findViewById(R.id.btFolderPlus);
        btFolderMinus = itemView.findViewById(R.id.btFolderMinus);
        dropDownMenu = itemView.findViewById(R.id.dropDown);
    }
}

这两个方法在每个复选框上被调用,它被选中或取消选中:

@Override
public void onCheckboxChangeTrue(CategoryChild childItem, String categoryName) {

    boolean containsName = false;

    if(this.checkedValues != null && !this.checkedValues.isEmpty()) {
        for(CategoryName checkedCategory: this.checkedValues) {

            if(checkedCategory.getCategoryName().equals(categoryName)) {

                if(!checkedCategory.getChildViewList().contains(childItem)) {
                    checkedCategory.getChildViewList().add(childItem);
                }

                containsName = true;

            }
        }

    }
    if(!containsName) {
        ArrayList<CategoryChild> childList = new ArrayList<>();
        childList.add(childItem);
        this.checkedValues.add(new CategoryName(categoryName, childList));
    }

    if(!this.uncheckedValues.isEmpty() && this.uncheckedValues != null) {


        for(CategoryName uncheckedCategory: this.uncheckedValues) {

            if(uncheckedCategory.getCategoryName().equals(categoryName)) {

                if(uncheckedCategory.getChildViewList().contains(childItem)) {
                    uncheckedCategory.getChildViewList().remove(childItem);
                    break;
                }

            }
        }


    } else {
        this.uncheckedValues.clear();
    }


}

@Override
public void onCheckboxChangeFalse(CategoryChild childItem, String categoryName) {

    boolean containsName = false;

    if(!this.checkedValues.isEmpty() && this.checkedValues != null) {
        for (CategoryName checkedCategory : this.checkedValues) {

            if (checkedCategory.getCategoryName().equals(categoryName)) {

                if (checkedCategory.getChildViewList().contains(childItem)) {
                    checkedCategory.getChildViewList().remove(childItem);
                    break;
                }

            }
        }
    }
    else {
        this.checkedValues.clear();
    }

    for(CategoryName uncheckedCategory: this.uncheckedValues) {

        if(uncheckedCategory.getCategoryName().equals(categoryName)) {

            if(!uncheckedCategory.getChildViewList().contains(childItem)) {
                uncheckedCategory.getChildViewList().add(childItem);
            }

            containsName = true;

        }
    }

    if(!containsName) {
        ArrayList<CategoryChild> childList = new ArrayList<>();
        childList.add(childItem);
        this.uncheckedValues.add(new CategoryName(categoryName, childList));
    }


}

问题来了:

每次我选中一个复选框时,它都会被添加到“checkedValues”中,这很好,但它会从“uncheckedValues”AND“allValues”中删除,尽管 allValues 应该保持不变。

我什至没有在“allValues”数组列表上调用 remove() 方法,只在“uncheckedValues”和“checkedValues”上调用。那么,“allValues”的元素怎么可能也被删除呢?

提前致谢!

【问题讨论】:

    标签: java android arraylist checkbox


    【解决方案1】:

    这是因为这两个 Arraylist 都与“categoryTopic”Arraylist 相关。这就是为什么即使您在“uncheckedValues”而不是“allValues”上调用 remove() 函数,它也会更改两个 Arraylists

    【讨论】:

    • 这不可能,因为我什至尝试在构造函数中创建 2 个不同的参数,但其值与“categoryTopic”相同,并将第一个新参数添加到“allValues”和第二个到“uncheckedValues”,所以它们是不同的,它仍然没有工作
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 2011-06-24
    • 2016-07-23
    • 1970-01-01
    • 2015-06-15
    • 2011-05-13
    相关资源
    最近更新 更多