在java中创建和删除视图

时间:2013-11-03 09:54:09

标签: android android-layout android-view

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

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

2 个答案:

答案 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>()