我有一个垂直方向的LinearLayout作为父级,我想以编程方式多次向该父级添加一些视图。现在,每次在添加到父元素之前获取对每个UI元素的新引用时,我都会给孩子充气。这似乎不是非常有效,有没有更好的方法来做到这一点。
我正在使用的当前代码如下,如果我在循环之前只膨胀一次我得到运行时错误“他指定的孩子已经有父。你必须首先在孩子的父母上调用removeView()。”
LayoutInflater inflator = LayoutInflater.from(getBaseContext());
LinearLayout parentPanel = findViewById(R.id.parent_pannel);
ArrayList<String> myList = getData();
for(String data : myList) {
// inflate child
View item = inflator.inflate(R.layout.list_item, null);
// initialize review UI
TextView dataText = (TextView) item.findViewById(R.id.data);
// set data
dataText.setText(data);
// add child
parentPanel.addView(item);
}
答案 0 :(得分:28)
你真的检查过充气是否缓慢?据我所知,膨胀视图非常快(几乎和手动创建视图一样快)。
听到这一点可能会让您感到惊讶,但实际上膨胀并不能解析XML。布局的XML在编译时被解析和预处理 - 它们以二进制形式存储,这使得视图膨胀非常有效(这就是为什么你不能从运行时生成的XML中扩展视图的原因)。
答案 1 :(得分:5)
我不确定您的观点是什么,但是您是否通过夸大XML手动创建它:
ArrayList<String> myList = getData();
for(String data : myList) {
LinearLayout layout = new LinearLayout(this);
layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TextView textView = new TextView(this);
textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
textView.setText(data);
layout.addChild(textView);
parentPanel.addView(layout);
}
但是,你明确尝试用Simple ListView&amp; API
答案 2 :(得分:5)
您不能,即使您尝试从旧new view
对象创建view
,对象也会通过引用而不是值传递,因此您将得到 childAlreadyHasParent 的异常,因此,唯一的方法是将view
放入for loop
,并输入您想要的次数要膨胀,这个循环必须包含从开始不仅仅是膨胀线的创建过程。
答案 3 :(得分:4)
多次充气无法以单次拍摄的方式完成。希望这有效
LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout parentPanel = findViewById(R.id.parent_pannel);
ArrayList<String> myList = getData();
for(String data : myList) {
// inflate child
View item = inflator.inflate(R.layout.list_item, null);
// initialize review UI
TextView dataText = (TextView) item.findViewById(R.id.data);
// set data
dataText.setText(data);
// add child
parentPanel.addView(item);
}
这将起作用,至少在我工作