35

我有一个垂直方向的 LinearLayout 作为父级,我想以编程方式多次向该父级添加一些视图。现在,每次在添加到父级之前,每次获取对每个 UI 元素的新引用时,我都会给子级充气。这似乎不是很有效,有没有更好的方法来做到这一点。

我正在使用的当前代码如下,如果我在 for 循环之前只膨胀一次,我会收到运行时错误“他指定的孩子已经有一个父母。你必须先在孩子的父母上调用 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

4 回答 4

28

你真的检查过充气是否慢吗?据我所知,膨胀视图非常快(几乎与手动创建视图一样快)。

您可能会感到惊讶,但实际上 inflate 根本不解析 XML。用于布局的 XML 在编译时被解析和预处理——它们以二进制形式存储,这使得视图膨胀非常有效(这就是为什么你不能从运行时生成的 XML 中膨胀视图)。

于 2011-06-28T23:01:30.557 回答
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 & API为您完成的事情

于 2011-06-28T22:55:35.663 回答
5

您不能,即使您尝试new view从旧view对象创建 a,该对象也将通过引用而不是值传递,因此您将得到一个异常作为childAlreadyHasParent,因此,唯一的方法是viewfor loop您希望它膨胀的次数,并且这个循环必须包含从头开始的创建过程,而不仅仅是膨胀线。

于 2014-06-04T08:46:48.563 回答
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);
    }

这会起作用,至少对我有用

于 2012-12-07T16:24:37.653 回答