Reputation: 5
Could some one help me I don't know why I get this error.
FATAL EXCEPTION: main Process: com.sangra.igurdwara, PID: 24038 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:4659) at android.view.ViewGroup.addView(ViewGroup.java:4495) at android.view.ViewGroup.addView(ViewGroup.java:4436) at android.support.v7.widget.RecyclerView$5.addView(RecyclerView.java:676) at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107) at android.support.v7.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:7399) at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7357) at android.support.v7.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:7345) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1459) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3183) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3627) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1731) at android.widget.LinearLayout.onLayout(LinearLayout.java:1496) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) at android.widget.FrameLayout.onLayout(FrameLayout.java:281) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) at android.widget.FrameLayout.onLayout(FrameLayout.java:281) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) at android.widget.FrameLayout.onLayout(FrameLayout.java:281) at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:3172) at android.view.View.layout(View.java:17993) at android.view.ViewGroup.layout(ViewGroup.java:5817) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2759) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2460) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1528) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7524) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911) at android.view.Choreographer.doCallbacks(Choreographer.java:686) at android.view.Choreographer.doFrame(Choreographer.java:622) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7325) at java.lang.reflect.Method.invoke(Native Method) 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);
}
}
Upvotes: 0
Views: 1814
Reputation: 12615
You are passing the child TextView in the constructor of the ViewHolder which is not right. You should pass the parent view and unwrap it in the constructor instead.
static class TenantViewHolder extends RecyclerView.ViewHolder {
TextView nameTextView;
TenantViewHolder(View itemView) {
super(itemView);
nameTextView = (TextView) itemView.findViewById(R.id.item_tenant_name);
}
}
and in Your Adapter just pass the inflated view directly.
@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;
}
Upvotes: 3