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

mks*_*kso 34 layout android 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);
        }
Run Code Online (Sandbox Code Playgroud)

Jar*_*iuk 28

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

你可能会听到令人惊讶的事实,但实际上膨胀根本不解析XML.布局的XML在编译时被解析和预处理 - 它们以二进制形式存储,这使得视图膨胀非常有效(这就是为什么你不能从运行时生成的XML中扩展视图的原因).

  • https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/view/LayoutInflater.java 第 424 行 (3认同)

Blu*_*ell 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);
    }
Run Code Online (Sandbox Code Playgroud)

但是,你明确尝试使用Simple ListViewAPI为你完成的事情


Muh*_*aat 5

你不能,即使你试图new view从旧view对象创建一个对象将通过引用传递而不是值,因此你将得到一个Exception作为childAlreadyHasParent,所以,唯一的方法是把它view放入一个for loopwith您希望它膨胀的次数,并且此循环必须包含从开始而不仅仅是膨胀线的创建过程.