I am attempting to create a custom Adapter for my ListView since each item in the list can have a different view (a link, toggle, or radio group), but when I try to run the
The accepted answer is correct. This is what I am doing to avoid the problem:
public enum FoodRowType {
ONLY_ELEM,
FIRST_ELEM,
MID_ELEM,
LAST_ELEM
}
@Override
public int getViewTypeCount() {
return FoodRowType.values().length;
}
@Override
public int getItemViewType(int position) {
return rows.get(position).getViewType(); //returns one of the above types
}
Issue comes when getItemType value is wrong. This value should be an integer and should be from 0 to getViewTypeCount()-1.
The reason, is most likely because the getItemViewType method is returning the wrong values! Each row in listview is a one View. While scrooling getItemViewType reach more than View's count.
What to do? How to avoid issue?
First determine view(row) in your listview that is shown first.While Scrolling use moduler equation
@Override
public int getItemViewType(int position) {
return choseType(position);//function to use modular equation
}
@Override
public int getViewTypeCount() {
return 10;
}
In this example there is ten view(10 row).
private int choseType(int position){
if(position%10==0)
return 0;
else if(position%10==1)
return 1;
else if(position%10==2)
return 2;
else if(position%10==3)
return 3;
else if(position%10==4)
return 4;
else if(position%10==5)
return 5;
else if(position%10==6)
return 6;
else if(position%10==7)
return 7;
else if(position%10==8)
return 8;
else
return 9;
}
Important
Some users mentioned on another question on stackoverflow that method
public int getViewTypeCount() and public int getItemViewType(int position) fix like Tooglebutton automaticly enable state check true on scrooling..that is big wrong .If you dont want automatic enbale on scrool just do
toogleButton.setChecked(false);
on getView override method.
The item view type you are returning from
getItemViewType()
is >= getViewTypeCount()
.