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

Error while duplicating a view: The specified child already has a parent

在我的 RecylcerAdapter 中,我想复制一个 TextView

我有一个 LinearLayout,其中包含一个 TexView。我想要的只是在 LinearLayout 中动态复制这个 TextView,这样我在 LinearLayout.

中就有 10 个 TextView
    <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 的所有属性复制到新创建的 TextView。

你做的是错误的,你不能用rowTextView = tags;复制TextView属性,你只是用tags替换rowTextView TextView .

您需要通过代码设置新的 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);

}

您可以创建一个仅包含具有所需属性的 TextView 的 xml 布局,并在您的 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);

 }

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

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)
}

出现这个错误的原因是,

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 时 "rowTextView" 现在两个标签和 rowTextView 都引用相同的对象,该对象已经存在于 tag.ll LinearLayout 中,这就是为什么它会抛出一个错误。

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

如果您安装了最新的 AndroidStudio,您只需创建一个带有列表的新片段,AndroidStudio 将为您提供一个如何使用 RecyclerView Adapter 填充列表的很好的示例。或查看此 link

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

希望我有所帮助。