在我的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。
答案 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)
}