Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何通过仅膨胀一次将同一视图多次添加到父视图_Android_Layout_View_Add_Inflate - Fatal编程技术网

Android 如何通过仅膨胀一次将同一视图多次添加到父视图

Android 如何通过仅膨胀一次将同一视图多次添加到父视图,android,layout,view,add,inflate,Android,Layout,View,Add,Inflate,我有一个垂直方向的线性布局作为父对象,我想以编程方式多次向该父对象添加一些视图。现在,每次在添加到父元素之前获取对每个UI元素的新引用时,我都会对子元素进行膨胀。这似乎不是很有效,有没有更好的方法来做到这一点 我正在使用的当前代码如下所示,如果我在for循环之前只充气一次,我会得到运行时错误“他指定的子项已经有父项。您必须首先对子项的父项调用removeView() LayoutInflater充气器=LayoutInflater.from(getBaseContext()); LinearLa

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

我正在使用的当前代码如下所示,如果我在for循环之前只充气一次,我会得到运行时错误“他指定的子项已经有父项。您必须首先对子项的父项调用removeView()

LayoutInflater充气器=LayoutInflater.from(getBaseContext());
LinearLayout parentPanel=findViewById(R.id.parentPanel);
ArrayList myList=getData();
用于(字符串数据:myList){
//充气儿童
视图项=充气机。充气(R.layout.list\u项,空);
//初始化审查界面
TextView数据text=(TextView)item.findViewById(R.id.data);
//设置数据
dataText.setText(数据);
//添加子项
parentPanel.addView(项目);
}

我不确定您的视图是什么,但您是否手动创建了该视图,从而过度膨胀了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);
    }
ArrayList myList=getData();
用于(字符串数据:myList){
LinearLayout布局=新的LinearLayout(本);
layout.setLayoutParams(新的LinearLayout.LayoutParams(LayoutParams.WRAP_内容,LayoutParams.WRAP_内容));
TextView TextView=新的TextView(此);
textView.setLayoutParams(新的LinearLayout.LayoutParams(LayoutParams.FILL\u父级,LayoutParams.WRAP\u内容));
textView.setText(数据);
layout.addChild(textView);
parentPanel.addView(布局);
}

但是是的,你显然在尝试用&

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


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

多次膨胀不能像单次膨胀一样进行。希望这能奏效

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);
    }
LayoutInflater充气器=(LayoutInflater).getSystemService(Context.LAYOUT\u充气器\u服务);
LinearLayout parentPanel=findViewById(R.id.parentPanel);
ArrayList myList=getData();
用于(字符串数据:myList){
//充气儿童
视图项=充气机。充气(R.layout.list\u项,空);
//初始化审查界面
TextView数据text=(TextView)item.findViewById(R.id.data);
//设置数据
dataText.setText(数据);
//添加子项
parentPanel.addView(项目);
}

这将起作用,至少对我有效,你不能,即使你试图从旧的
视图创建一个
新视图
,该对象将通过引用而不是值传递,因此你将得到一个异常作为儿童易读组件,等等,唯一的方法是将
视图
放入一个
for循环
,循环次数与您希望它膨胀的次数相同,并且这个循环必须包含从一开始的创建过程,而不仅仅是膨胀的线条。

我同意,如果有一种简单的方法“克隆”视图会很好,但我还没有找到它。它一次又一次地膨胀。然而,我不得不说,从您的代码片段来看,您似乎希望使用
ListView
。我恐怕这是出于设计。一个视图不能有多个父视图,也不能多次向父视图添加同一视图。如果不是这样的话,为视图组(和类似场景)编写无bug代码将是相当困难的。@dmon我没有将布局设计为使用ListView,因为它会使代码更加复杂,因为我希望以这种方式布置每件事。我想为了提高效率,我必须将所有内容都转移到ListView。我指出这一点的原因是,
ListView
出于同样的原因回收视图。因为一次只能看到N个视图,所以它只会膨胀那些必要的视图,然后重用它们。如果你看到你自己添加了很多的观点,你会考虑一些事情。我会想到,多次夸大相同的XML布局实际上会创建不同的对象,但会产生相同的结构。为什么h.ll不可能做到这一点?顺便说一句,ListView并不总是一个选项:假设您在ScrollView中拥有所有内容-您不能在ScrollView中拥有ListView。在这种情况下,从xml扩展布局会非常好。第424行我不同意,在我的活动或片段创建过程中,XML膨胀总是需要最长的时间,这就是为什么我尝试保持布局结构尽可能简单。我的观点是,如果您有多个级别的嵌套布局,无论是手动还是膨胀,它都会很慢。因此,我同意您应该尽可能保持布局简单(最好在最新的GoogleI/O16之后,我们都将很快转向更简单/更少嵌套的受约束布局)。我唯一的观点是,没有涉及XML解析,所以解析不是问题。@JarekPotiuk感谢您的澄清!对我来说,视图v=inflater.inflate(R.layout.list_item,parent,false)也适用,之后调用addView(v)。如果已经存在,则充气(…)可能没有要附加的优化。如果必须在回收器视图行中添加与上面相同的动态视图,您能给我一些建议吗
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);
    }