Originally I got this error:
The specified child already has a parent. You must call removeView() on the child's parent first
at
customSection.addView(customLayout);
So I added
((LinearLayout)customLayout.getParent()).removeView(customLayout);
and now 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 fragment that allows derived classes to supply a custom layout for the 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've also tried inflater.inflate(R.layout.list_item_custom_section, null)
... false, null / false, what gives?
EDIT:
@allprog, I knew some cleanup was needed. I wrote this at the end of the day somewhat in a hurry. I have since cleaned up the code, and separated out the binding and inflating of the view. Cleaned up 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 original [unkempt] code that was the solution.
customSection
? Can you show the code where it is first initialized? – MoniescustomSection
would still need to be declared (and set) somewhere. Can you post that code? – MoniescustomSection
initialization is nowhere. What you've answered is thecustomLayout
inflater. We'd need to see how'scustomSection
defined and what it even is. – DishgetChildItemView
despite its name actually has side effects. I guess, if you clean up this chaos, everything will start working as it should. (PS: the debugger is your friend!) – Catmint