2017-02-23 5 views
0

なぜこのエラーが発生するのか分かりません。指定された子には親があり、リサイクラビューを作成しています

致命的な例外:メイン プロセス:com.sangra.igurdwara、PID:24038 java.lang.IllegalStateException:指定された子はすでに 親を持っています。子の親で最初にremoveView()を呼び出す必要があります。 android.view.ViewGroup.addView(ViewGroup.java:4659)の android.view.ViewGroup.addView(ViewGroup.java:4465)の 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にあります。 android.support.v7.widget.RecyclerView.dispatchLayoutでandroid.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374) でLinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580) (RecyclerView.java:3183) (ViewGroup.java:3627) 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でandroid.widget.LinearLayout.layoutHorizo​​ntalで(LinearLayout.java:1742) android.widget.LinearLayout.onLayoutで(LinearLayout.java:1731) (LinearLayout.java:1496) でandroid.view.View.layout(View.java:17993)android.view.ViewGroup.layout(ViewGroup.java:5817)で android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)で アンドロイドで 。ウィジェット.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.view.View.layout(View.java:17993)でandroid.widget.FrameLayout.layoutChildren android.widget.FrameLayout.onLayoutで(FrameLayout.java:344) (FrameLayout.java:281) で) 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) at 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) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1528) at android.view.ViewRootImpl $ Trav ersalRunnable.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) )は、アンドロイド。 Handler.dispatchMessage(Handler.java:95)android.os.Looper.loop(Looper.java:148)の android.app.ActivityThread.main(ActivityThread.java:7325)の のjava.lang.refleでct.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230) at 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; 
} 
関連する問題