指定的孩子已经有一个父母,正在创建回收站视图

Posted

技术标签:

【中文标题】指定的孩子已经有一个父母,正在创建回收站视图【英文标题】:The specified child already has a parent, creating recycler view 【发布时间】:2017-07-14 14:04:58 【问题描述】:

有人可以帮助我吗?我不知道为什么会出现此错误。

致命异常:主要 进程:com.sangra.igurdwara,PID:24038 java.lang.IllegalStateException:指定的孩子已经有一个 父母。您必须首先在孩子的父母上调用 removeView()。 在 android.view.ViewGroup.addViewInner(ViewGroup.java:4659) 在 android.view.ViewGroup.addView(ViewGroup.java:4495) 在 android.view.ViewGroup.addView(ViewGroup.java:4436) 在 android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:676) 在 android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107) 在 android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7399) 在 android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7357) 在 android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7345) 在 android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1459) 在 android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408) 在 android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580) 在 android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374) 在 android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3183) 在 android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3627) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) 在 android.widget.LinearLayout.layoutHorizo​​ntal(LinearLayout.java:1731) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1496) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:281) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:281) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:281) 在 com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:3172) 在 android.view.View.layout(View.java:17993) 在 android.view.ViewGroup.layout(ViewGroup.java:5817) 在 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2759) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2460) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1528) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7524) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) 在 android.view.Choreographer.doCallbacks(Choreographer.java:686) 在 android.view.Choreographer.doFrame(Choreographer.java:622) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:7325) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

public class TenantAdapter extends RecyclerView.Adapter<TenantAdapter.TenantViewHolder> 

    private List<Tenant> values;
    private final OnItemClickListener listener;

    public TenantAdapter (List<Tenant> values, OnItemClickListener listener) 
    this.values = values;
    this.listener = listener;
    

    public interface OnItemClickListener 
    void onItemClick(Tenant tenant);
    


    static class TenantViewHolder extends RecyclerView.ViewHolder 

    TextView nameTextView;

    TenantViewHolder(TextView itemView) 
        super(itemView);
        nameTextView = itemView;
    

    void bind(final Tenant tenant, final OnItemClickListener listener)
        nameTextView.setText(tenant.getName());
        itemView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                listener.onItemClick(tenant);
            
        );
    
    


    @Override
    public TenantViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tenant, parent, false);
    TextView nameTextView = (TextView) rowView.findViewById(R.id.item_tenant_name);
    TenantViewHolder tenantViewHolder = new TenantViewHolder(nameTextView);
    return tenantViewHolder;
    

    @Override
    public void onBindViewHolder(TenantViewHolder holder, int position) 
    holder.bind(values.get(position), listener);
    

    @Override
    public int getItemCount() 
    return values.size();
    



public class TenantActivity extends AppCompatActivity 

    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tenant);
    recyclerView = (RecyclerView) findViewById(R.id.activity_tenant_recycler_view);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    List<Tenant> values = new ArrayList<>();
    Tenant temp = new Tenant();
    temp.setName("Gurdwara Guru Nanak Mission Sewa Society");
    values.add(temp);
    adapter = new TenantAdapter(values, new TenantAdapter.OnItemClickListener() 
        @Override
        public void onItemClick(Tenant tenant) 
            TenantActivity.this.startActivity(new Intent(TenantActivity.this, HomeActivity.class));
        
    );
    recyclerView.setAdapter(adapter);
    


【问题讨论】:

【参考方案1】:

您在 ViewHolder 的构造函数中传递了子 TextView,这是不正确的。您应该传递父视图并在构造函数中解包它。

static class TenantViewHolder extends RecyclerView.ViewHolder 

    TextView nameTextView;

    TenantViewHolder(View itemView) 
        super(itemView);
        nameTextView = (TextView) itemView.findViewById(R.id.item_tenant_name);
    

在你的适配器中直接传递膨胀的视图。

@Override
public TenantViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tenant, parent, false);
    TenantViewHolder tenantViewHolder = new TenantViewHolder(rowView);
    return tenantViewHolder;

【讨论】:

以上是关于指定的孩子已经有一个父母,正在创建回收站视图的主要内容,如果未能解决你的问题,请参考以下文章

Fragments - 指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

IllegalStateException,指定的孩子已经有一个父母 - ListFragment

Android - ArrayAdapter<LinearLayout> :指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

我继续收到错误消息“指定的孩子已经有一个父母。您必须首先在该孩子的父母上调用removeView()(Android)

冲突的 Android 错误消息:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。 (C#)