Android 动态添加CheckBox后删除对应选中布局问题求解
问题根因
你代码的问题出在全局变量的引用覆盖:linr和chbox都是类全局变量,每次生成新子布局时,这两个变量的指向都会被更新为最新创建的子布局和对应的CheckBox,所以点击删除按钮时,永远只会判断和删除最后添加的那一组组件。
修复方案
第一步:调整creatt()方法
将linr和chbox改为方法内局部变量,不需要全局存储所有子项引用:
public void creatt() { LinearLayout linr = new LinearLayout(this); linr.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); linr.setOrientation(LinearLayout.HORIZONTAL); linr.setGravity(Gravity.RIGHT); TextView txt = new TextView(this); txt.setText(item); linr.addView(txt); CheckBox chbox = new CheckBox(this); linr.addView(chbox); linear.addView(linr); // 主布局 }
第二步:重写删除按钮逻辑
遍历主布局所有子项,判断每个子布局内的CheckBox是否被选中,选中则移除,同时支持批量删除多个选中的子布局:
public void deletBtn(View view) { // 先收集所有待删除的子布局,避免遍历中修改结构导致索引异常 List<LinearLayout> waitRemoveList = new ArrayList<>(); for (int i = 0; i < linear.getChildCount(); i++) { View childView = linear.getChildAt(i); if (childView instanceof LinearLayout) { LinearLayout itemLayout = (LinearLayout) childView; // 取子布局第2个位置的组件即CheckBox(第1个是TextView) CheckBox checkBox = (CheckBox) itemLayout.getChildAt(1); if (checkBox.isChecked()) { waitRemoveList.add(itemLayout); } } } // 批量移除所有选中的子布局 for (LinearLayout layout : waitRemoveList) { linear.removeView(layout); } }
优化说明
如果后续你需要调整子布局内的组件顺序,不想依赖位置索引取CheckBox,可以在生成CheckBox时给它绑定父布局Tag,修改creatt()中CheckBox的初始化代码:
CheckBox chbox = new CheckBox(this); chbox.setTag(linr); // 绑定当前子布局到CheckBox的Tag linr.addView(chbox);
后续如果需要取对应子布局,直接调用checkBox.getTag()即可获取,无需依赖位置索引。
内容的提问来源于stack exchange,提问作者Garboun Tech
相关产品推荐
相关产品推荐

