0

我正在动态创建大量视图并将它们添加到我的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);
}

正如我所说,问题在于并不是所有的行都被删除了——我没有设法找出哪些被删除而哪些没有被删除的模式。

4

2 回答 2

0

您的删除代码中有错误。

for (int i = 0; i <= lineChain.size() -1; i++) {
    LineView lv = lineChain.get(i);
    wrapper.removeView(lv);
    lineChain.remove(i);
}

函数的文档ArrayList.remove(int)说:

移除此列表中指定位置的元素。将任何后续元素向左移动(从它们的索引中减去 1)。

当您删除 index 处的项目时i,所有剩余元素都会向左移动。因此,例如,如果您删除位置 0 处的元素。位置 1 处的元素将移动到位置 0 并且永远不会被删除(因为您正在递增i)。

您的代码:

while (!lineChain.isEmpty()) {
    LineView lv = lineChain.get(0);
    wrapper.removeView(lv);
    lineChain.remove(0);
}
于 2013-11-03T10:01:36.197 回答
0

我认为问题出在循环后从列表中删除元素时。

你应该这样做:

for (LineView lv : lineChain) {
    ((RelativeLayout) namebar.getParent()).removeView(namebar);
}

如果您想摆脱所有元素,只需重置列表

lineChain = new ArrayList<LineView>()
于 2013-11-03T10:05:59.083 回答