I originally got this error:
The specified child already has a parent. You must call removeView () first on the parent parent
at
customSection.addView(customLayout);
So I added
((LinearLayout)customLayout.getParent()).removeView(customLayout);
and now we get
java.lang.NullPointerException
So, if the child has a parent and I must first remove the child from the parent, why does getParent () return null?
I have an abstract snippet that allows derived classes to provide a custom layout for a list adapter. Relevant Code:
Binding:
public void bind(DataObject row) { View customLayout = getChildItemView(row); if (customLayout != null) { ((LinearLayout) customLayout.getParent()).removeView(customLayout); customSection.removeAllViews(); customSection.addView(customLayout); customSection.setVisibility(View.VISIBLE); } else { customLayout.setVisibility(View.INVISIBLE); } } protected View getChildItemView(CommonRow row) { if (parentView == null) { parentView = (LinearLayout) LayoutInflater.from(getActivity()) .inflate(R.layout.list_item_custom_section, new LinearLayout(getActivity()), true); label = (TextView) parentView.findViewById(R.id.txtData1Label); value = (TextView) parentView.findViewById(R.id.txtData1Value); } label.setText("Minimum"); value.setText(manager.formatMoney(((SpecificDataRow) row).minimum)); return parentView; }
I also tried inflater.inflate(R.layout.list_item_custom_section, null) ... false, null / false, what gives?
EDIT:
@allprog, I knew some sort of cleanup was needed. I wrote this at the end of the day somewhat in a hurry. Since then, I have cleaned up the code and separated the binding and inflating of the view. Cleared Code:
private class ViewHolder { .... public ViewHolder(View v) { Butterknife.inject(this, v); View custom = createCustomView(customSection); if (custom != null) { customSection.setVisibility(View.VISIBLE); customSection.addView(custom); } } public void bind(CommonRow row) { ...... bindCustomView(row, customSection); } }
Child class:
@Override protected View createCustomView(ViewGroup parent) { return LayoutInflater.from(getActivity()).inflate(R.layout.list_item_custom_section, parent, false); } @Override protected void bindCustomView(CommonRow row, ViewGroup section) { TextView label = Views.findById(section, R.id.txtData1Label); TextView value = Views.findById(section, R.id.txtData1Value); label.setText("Minimum"); value.setText(manager.formatMoney(((SpecificRow) row).minimum)); }
suitianshi got it first, with my source [unmanaged] code, which was the solution.