Android |指定的子项已有父项。您必须首先在孩子的父母上调用removeView()

时间:2016-07-12 10:23:10

标签: android android-recyclerview realm

我有以下适配器:

@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    holder.itemView.setEnabled(mAllowClicks);
    holder.itemView.setClickable(mAllowClicks);
}

@Override
public RealmViewHolder onCreateRealmViewHolder(ViewGroup viewGroup, int i) {
    View v = inflater.inflate(R.layout.item_list_layout, viewGroup, false);
    myViewHolder vh = new myViewHolder(v);

    return vh;
}

当我运行我的应用程序时,我收到以下错误:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    at android.view.ViewGroup.addViewInner(ViewGroup.java:3883)
    at android.view.ViewGroup.addView(ViewGroup.java:3736)
    at android.view.ViewGroup.addView(ViewGroup.java:3681)
    at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:638)
    at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
    at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7054)
    at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7012)
    at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7000)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1428)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
    at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)
    at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1043)
    at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4357)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
    at android.view.Choreographer.doCallbacks(Choreographer.java:580)
    at android.view.Choreographer.doFrame(Choreographer.java:549)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5349)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)

我使用的是RealmRecyclerAdapter,有人知道发生了什么事吗?

谢谢!

我正在向适配器添加项目,如下所示:

mList = mRealm.where(RealmItem.class).findAll();
mAdapter.UpdateList(mList);

这是UpdateList函数:

    public void UpdateList(RealmResults<RealmItem> newList) {
    super.updateRealmResults(newList);
    mList= newList;
}

2 个答案:

答案 0 :(得分:1)

当一个项目向适配器添加两次时会发生此问题,因此,当它第二次添加时,它会检测到它已经有父项,并且它不能有多个父项,因此会生成错误。

要解决这个问题,每次将其添加到适配器时,首先必须创建列表的新实例(或者您添加的任何视图),或者至少为您添加的每个视图创建一个新变量。

关于方法updateRealmResults,如documentation of Realm中所述,现在已弃用,必须使用以下签名的方法updateDate替换:

public void updateData(OrderedRealmCollection<T> data)

答案 1 :(得分:0)

我刚刚结束了类似的情况。

就我而言,它是一个包含复杂布局组件列表的RecyclerView。

解决使用:

holder.itemView.removeView(yourListHere.getRespectiveClassMethod());

作为onBindViewHolder方法中的最后一条指令。