复制视图时出错:指定的子项已有父项
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/
希望我有所帮助。
在我的 RecylcerAdapter
中,我想复制一个 TextView
。
我有一个 LinearLayout
,其中包含一个 TexView
。我想要的只是在 LinearLayout
中动态复制这个 TextView
,这样我在 LinearLayout
.
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/
希望我有所帮助。