复制视图时出错:指定的子级已有父级

时间:2016-02-13 17:18:42

标签: android android-adapter android-recyclerview illegalstateexception

在我的RecylcerAdapter中,我想要复制TextView

我的LinearLayout包含TexView。我想要的是在TextView内动态复制此LinearLayout,以便在TextView内有10个LinearLayout

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tags_ll"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:orientation="horizontal"
        android:gravity="right">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tags"
            android:layout_gravity="center_vertical"
            android:gravity="center"
            android:text="عمومی"
            android:layout_margin="5dp"
            android:padding="5dp"
            android:background="@drawable/border_with_background"
            android:textSize="12dp" />
    </LinearLayout>

RecyclerView中的MyViewHolder:

public MyViewHolder(View view) {
    super(view);

    tags = (TextView) view.findViewById(R.id.tags);
    tags_ll = (LinearLayout) view.findViewById(R.id.tags_ll);

    for (int i = 0; i < 10; i++) {
        TextView rowTextView = new TextView(view.getContext());
        //Clone the new textview, get all the properties of the existing textview
        rowTextView = tags;
        rowTextView.setText("This is row #" + i);
        tags_ll.addView(rowTextView);

    }

}

我收到以下错误:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我希望将现有textview的所有属性复制到新创建的TextViews。

3 个答案:

答案 0 :(得分:3)

出现此错误的原因是,

tags = (TextView) view.findViewById(R.id.tags);
TextView rowTextView = new TextView(view.getContext());
rowTextView = tags;
tags_ll.addView(rowTextView);  // tag.ll has already a child with id = tag

将该对象的引用复制到新的TextView&#34; rowTextView&#34;现在两个标签和rowTextView引用同一个已经存在于tag.ll LinearLayout中的Object,这就是它抛出错误的原因。

如果您只需要使用recyclerViewAdapter来实现一个列表,那么要使它变得非常复杂,当您要为该TextView变量分配新的引用时,无需从上下文中获取TextView。

如果你安装了最新的AndroidStudio,你可以用列表创建一个新的片段,Android Studio将为你提供一个很好的例子,说明如何使用RecyclerView Adapter来填充List。或者查看此链接

http://hmkcode.com/android-simple-recyclerview-widget-example/

希望我帮助过。

答案 1 :(得分:1)

您正在做的事情是错误的,您无法使用TextView复制rowTextView = tags;属性,而只是将rowTextView TextView替换为{tags 1}}一个。

您需要在代码中设置新的TextView属性:

for (int i = 0; i < 10; i++) {
    TextView rowTextView = new TextView(view.getContext());
    //set the new TextView properties from code
    rowTextView.setText("This is row #" + i);
    tags_ll.addView(rowTextView);

}

您可以创建一个xml布局,其中只包含具有所需属性的TextView,并在for循环中对其进行充气。

例如:

my_text_view.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:gravity="center"
    android:text="عمومی"
    android:layout_margin="5dp"
    android:padding="5dp"
    android:background="@drawable/border_with_background"
    android:textSize="12dp" />

ViewHolder

 LayoutInflater inflater = LayoutInflater.from(context);

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

      TextView rowTextView= (TextView) inflater.inflate(R.layout.my_text_view, null, false);
      rowTextView.setText("This is row #" + i);
      tags_ll.addView(rowTextView);

 }

答案 2 :(得分:1)

你的做法是错误的 - 这一行:

rowTextView = tags;

不会复制第一个TextView。这将使新引用指向原始textView,然后您会发现自己再次在布局中添加原始textView,从而导致错误。

您应该做的是创建新的textView并使用原始textView添加其属性,如下所示:

for (int i = 0; i < 10; i++) {
     TextView rowTextView = new TextView(view.getContext());
     rowTextView.setText(tags.getText());
     rowTextView.setGravity(tags.getGravity());
     //set all other properties like this: rowTextView.setOther(tags.getOther())...
     tags_ll.addView(rowTextView)
}