java.lang.IllegalStateException:指定的子级已有父级:On动态添加视图

时间:2015-02-24 06:12:16

标签: android

在我的应用中,我正在实施评论模块,我会在用户发布评论后动态添加评论布局。但我得到了

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

3 个答案:

答案 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);
    }