如何通过仅对其进行一次多次向父项添加相同的视图

时间:2011-06-22 14:29:26

标签: android layout view add inflate

我有一个垂直方向的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);
        }

4 个答案:

答案 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);
    }

这将起作用,至少在我工作