As we all know Android's listview and expandablelistview recycles its view. More info: The nuance of android listview.
I've read articles and information such as the above link on how to handle that but they only give only examples on list views not on Expandablelistview (whereas getView is the only method in listview while in expandablelistview there is getGroupView and getChildView).
My expandable listview's children has or needs to have different layouts because that's necessary to achieve the application's output.
Now, my question is how to properly handle the recycling of expandable list view that inflates different layouts in its child? Such as where to put the viewHolder or convertView in my expandablelistview's getChildView method.
I followed the code below from this site in achieving a child that inflates different layouts according to its position.
Whenever I click on another group. The previous group's child recycles its view to its default thus spinner and edit text values is not being retained. I think maybe its because it inflates once again the view?
Below is my getChildView method:
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
//layoutInflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);
//convertView = layoutInflater.inflate(R.layout.expandable_child_layout, parent, false);
try{
int itemType = getChildType(groupPosition, childPosition);
switch(itemType){
case 0:
ViewHolder mainHolder = null;
View v1 = null;
if(v1 == null){
mainHolder = new ViewHolder();
v1 = View.inflate(context, R.layout.newtrip_main, null);
v1.setTag(mainHolder);
mainHolder.tripType = (Spinner) v1.findViewById(R.id.spinTripType);
/*TripTypeAdapter = new ArrayAdapter<String>(NewTrip.this, android.R.layout.simple_spinner_item,getResources().getStringArray(R.array.triptypes)); //selected item will look like a spinner set from XML
TripTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tripType.setAdapter(TripTypeAdapter);*/
mainHolder.tripType.setOnItemSelectedListener(this);
}//else{
//mainHolder = (ViewHolder) v1.getTag();
//}
return v1;
//break;
case 1:
ViewHolder budgetHolder = null;
View v2 = null;
if(v2 == null){
budgetHolder = new ViewHolder();
v2 = View.inflate(context, R.layout.newtrip_budget, null);
v2.setTag(budgetHolder);
budgetHolder.budget = (Spinner) v2.findViewById(R.id.spinBudget);
budgetHolder.budgetAdapter = new ArrayAdapter<String>(NewTrip.this, android.R.layout.simple_spinner_item,getResources().getStringArray(R.array.budgettype)); //selected item will look like a spinner set from XML
budgetHolder.budgetAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
budgetHolder.budget.setAdapter(budgetHolder.budgetAdapter);
budgetHolder.budget.setOnItemSelectedListener(this);
}
return v2;
//break;
case 2:
ViewHolder foodHolder= null;
View v3 = null;
if(v3 == null){
foodHolder = new ViewHolder();
v3 = View.inflate(context, R.layout.newtrip_food, null);
v3.setTag(foodHolder);
}
return v3;
//break;
case 3:
ViewHolder accomHolder= null;
View v4 = null;
if(v4 == null){
accomHolder = new ViewHolder();
v4 = View.inflate(context, R.layout.newtrip_accommodation, null);
v4.setTag(accomHolder);
accomHolder.accommodation = (Spinner) v4.findViewById(R.id.spinAccommodation);
accomHolder.accommodationAdapter = new ArrayAdapter<String>(NewTrip.this, android.R.layout.simple_spinner_item,getResources().getStringArray(R.array.economicalAccomodation)); //selected item will look like a spinner set from XML
accomHolder.accommodationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
accomHolder.accommodation.setAdapter(accomHolder.accommodationAdapter);
//return convertView;
}
return v4;
//break;
}
}catch(Exception e){
Toast toast = Toast.makeText(context, e.toString(), Toast.LENGTH_LONG);
toast.show();
}
convertView.invalidate();
return convertView;
}
and here's the getGroupView method:
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
convertView = View.inflate(context, R.layout.expandable_group_layout, null);
TextView txtView = (TextView) convertView.findViewById(R.id.txt1);
if(groupPosition == 0) {
txtView.setText(" MAIN");
txtView.setTextSize(15f);
}
if(groupPosition == 1) {
txtView.setText(" BUDGET");
txtView.setTextSize(15f);
}
if(groupPosition == 2) {
txtView.setText(" FOOD");
txtView.setTextSize(15f);
}
if(groupPosition == 3) {
txtView.setText(" ACCOMMODATION");
txtView.setTextSize(15f);
}
convertView.invalidate();
return convertView;
}