【发布时间】: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