我正在动态创建大量视图并将其添加到我的RelativeLayout
。我需要跟踪所有这些视图,以便稍后删除它们,所以我添加它们是ArrayList
。但是,当我尝试从布局中删除所有内容时,它们并非全部删除。
ArrayList<LineView> lineChain = new ArrayList<LineView>();
LineView linkLine;
RelativeLayout wrapper; // Removed params etc.
// Later on in code
// This occurs many times
linkLine = new LineView(getApplicationContext());
wrapper.addView(linkLine, rlp);
lineChain.add(linkLine);
这是我尝试删除所有视图时的操作。这只发生一次:
for (int i = 0; i <= lineChain.size() -1; i++) {
LineView lv = lineChain.get(i);
wrapper.removeView(lv);
lineChain.remove(i);
}
正如我所说,问题是并非所有的行都被删除了 - 我没有设法找出被删除的模式,哪些不是。
答案 0 :(得分:0)
您的删除代码中存在错误。
for (int i = 0; i <= lineChain.size() -1; i++) {
LineView lv = lineChain.get(i);
wrapper.removeView(lv);
lineChain.remove(i);
}
ArrayList.remove(int)
函数的文档说:
删除此列表中指定位置的元素。转移任何 左边的后续元素(从索引中减去一个)。
当您删除索引i
处的项目时,所有剩余的元素都会向左移动。因此,例如,如果删除位置0处的元素。位置1处的元素将移至位置0并且永远不会被删除(因为您正在递增i
)。
你的代码:
while (!lineChain.isEmpty()) {
LineView lv = lineChain.get(0);
wrapper.removeView(lv);
lineChain.remove(0);
}
答案 1 :(得分:0)
我认为问题是在循环后从List中删除元素。
你应该这样做:
for (LineView lv : lineChain) {
((RelativeLayout) namebar.getParent()).removeView(namebar);
}
如果你想摆脱所有元素,只需重置列表
lineChain = new ArrayList<LineView>()