如何在其他布局中膨胀视图?

How to inflate view in other layout?

我必须创建一个包含框的水平滚动视图。每个盒子最多只能包含三个项目。所以我的逻辑是:

  1. 在水平滚动视图中创建框列表

    <HorizontalScrollView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:fillViewport="true">
         <LinearLayout
              android:id="@+id/ll_list"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:orientation="horizontal">
         </LinearLayout>
    </HorizontalScrollView>
    
  2. 创建box.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <LinearLayout
            android:id="@+id/ll_box"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
        </LinearLayout>
    </LinearLayout>
    
  3. 为项目(在框中)创建 item.xml

在Java 例如,有 7 件物品,所以我需要 3 个箱子。 这是我的代码,

public void initList(){
   View box = getLayoutInflater().inflate(R.layout.box, null);
   LinearLayout ll_box = (LinearLayout)box.findViewById(R.id.ll_box);
   int item = 7;
   int idx = item/3; //idx is a number of boxes
   if (item%3!=0)
       idx++;

    for (int i=0; i<idx; i++ ){
        for(int j=0; j<3; j++){
            ll_box.addView(LayoutInflater.from(this).inflate(R.layout.item, null));
        }
        ll_list.addView(ll_box);
    }
}

问题是我在 ll_list.addView(ll_box); java.lang.IllegalStateException: 指定的child已经有一个parent。您必须先在 child 的 parent 上调用 removeView()。

如果你不明白问题请问我。我真的需要你的帮助。谢谢你。

您必须在每个步骤中创建一个新的 box View

像这样:

for (int i=0; i<idx; i++ ){

   View box = getLayoutInflater().inflate(R.layout.box, null);
   LinearLayout ll_box = (LinearLayout)box.findViewById(R.id.ll_box);

   for(int j=0; j<3; j++){
       ll_box.addView(LayoutInflater.from(this).inflate(R.layout.item, null));
   }
   ll_list.addView(box); //here add `box` instead of `ll_box`!!
}