在我的应用中,我正在实施评论模块,我会在用户发布评论后动态添加评论布局。但我得到了
illegalstateException:指定的孩子已经是父母。你必须先在子父母上调用removeView()。
我正在膨胀comment.xml并将其添加到评论部分视图中。 代码是这样的:
public void loadCommentUiFragment(List<UserComment> userCommentList){
View commentView = null;
if(commentView != null){
commentSection.removeView(commentView);
}
for(UserComment userComment : userCommentList){
LayoutInflater inflator = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
commentView = inflator.inflate(R.layout.comment_section, null);
ImageView userImageView = (ImageView) commentView.findViewById(R.id.user_image);
TextView userNameView = (TextView) commentView.findViewById(R.id.user_name);
TextView userTimeView = (TextView) commentView.findViewById(R.id.user_time);
TextView userCommentView = (TextView) commentView.findViewById(R.id.user_comments);
userNameView.setText(userComment.getUserName());
userTimeView.setText(userComment.getCreatedAt());
userCommentView.setText(userComment.getCommentText());
commentSection.addView(commentView);
}
userCommentList.clear();
}
comment.xml 是
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/post_comment_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip"
>
<LinearLayout
android:id="@+id/line_divider"
android:layout_width="match_parent"
android:layout_height="3dip"
android:layout_marginTop="5dip"
android:layout_marginBottom="10dip"
android:background="@color/layout_bg"
android:orientation="vertical">
</LinearLayout>
<ImageView
android:id="@+id/user_image"
android:layout_width="40dip"
android:layout_height="40dip"
android:background="@color/layout_bg"
android:layout_below="@+id/line_divider"
/>
<TextView
android:id="@+id/user_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="user_name"
android:layout_toRightOf="@+id/user_image"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:textColor="#000000"
android:textStyle="bold"/>
<TextView
android:id="@+id/user_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Time of comments"
android:layout_toRightOf="@+id/user_name"
android:layout_marginLeft="80dip"
android:layout_marginTop="10dip"
android:textColor="#000000"
android:textStyle="bold"
android:maxLength="7"/>
<TextView
android:id="@+id/user_comments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/user_name"
android:text="comments of the user"
android:layout_toRightOf="@+id/user_image"
android:layout_marginLeft="10dip"
android:layout_marginTop="5dip"
android:textColor="#000000"
android:textSize="16dip"/>
</RelativeLayout>
main_activity.xml
<LinearLayout
android:id="@+id/commment_section"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="vertical"
android:layout_below="@+id/nmd_user_img"
android:layout_marginBottom="40dip"
>
<RelativeLayout
android:id="@+id/pre_comment_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#90C695"
>
<ImageView
android:id="@+id/cmt_user_image"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_margin="5dip"
android:padding="2dip"
android:background="@color/layout_bg"/>
<EditText
android:id="@+id/cmt_user_edt"
android:layout_width="240dip"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/cmt_user_image"
android:layout_marginLeft="10dip"
android:padding="5dip"
android:hint="Enter your comments"/>
<LinearLayout
android:layout_width="100dip"
android:layout_height="wrap_content"
android:layout_below="@+id/cmt_user_image"
android:layout_marginTop="5dip"
android:gravity="center_horizontal"
android:layout_gravity="center"
>
<ImageButton
android:id="@+id/post_comment"
android:layout_width="90dip"
android:layout_height="40dip"
android:layout_marginTop="5dip"
android:layout_marginRight="15dip"
android:background="@drawable/post"/>
</LinearLayout>
</RelativeLayout>
我没有得到如何解决这个问题。上面代码的问题是,如果我不调用removeView()。它会继续添加以前的视图以及新加载的视图。
因此,在ID commment_section 的 LinearLayout 中,我正在动态地扩充 comment.xml 。
答案 0 :(得分:2)
上面代码的问题是,如果我不调用removeView()。它的 继续添加以前的视图以及新加载的视图
要始终显示新视图的布局,请使用removeAllViews
代替removeView
,如:
if(commentSection != null){
int childCount=commentSection.getChildCount();
if(childCount>0)
commentSection.removeAllViews();
}
illegalstateException:指定的子节点已经是父节点。您 必须首先在子父级上调用removeView()。
在commentView
中添加commentSection
之前,为每个视图分配一个新ID:
int view_id=2015;
for(UserComment userComment : userCommentList){
LayoutInflater inflator=(LayoutInflater)getSystemService(
LAYOUT_INFLATER_SERVICE);
View commentView = inflator.inflate(R.layout.alertboxdialog, null);
commentView.setId(view_id);
view_id++;
//.....
}
答案 1 :(得分:1)
您要再次添加的相同View对象可能会导致异常
每次在for循环中尝试以下操作时,请使用新视图
for(UserComment userComment : userCommentList){
LayoutInflater inflator = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View commentView = inflator.inflate(R.layout.comment_section, null);
.............................
...............................
commentSection.addView(commentView);
}
希望这会对你有所帮助。
答案 2 :(得分:0)
根据您的代码,您不会尝试在父视图中添加相同的视图(ID)。您必须创建每个新的View
。
在你的情况下它是全球性的。试着把内部循环。
View commentView = null; [Wrong]
for(....){
LayoutInflater inflator = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View commentView = inflator.inflate(R.layout.comment_section, null);
commentSection.addView(commentView);
}