ArrayIndexOutOfBoundsException with custom Android Adapter for multiple views in ListView

前端 未结 4 1835
暗喜
暗喜 2020-11-28 18:53

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

相关标签:
4条回答
  • 2020-11-28 19:09

    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
    }
    
    0 讨论(0)
  • 2020-11-28 19:14

    Issue comes when getItemType value is wrong. This value should be an integer and should be from 0 to getViewTypeCount()-1.

    0 讨论(0)
  • 2020-11-28 19:23

    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.

    0 讨论(0)
  • 2020-11-28 19:29

    The item view type you are returning from

    getItemViewType() is >= getViewTypeCount().

    0 讨论(0)
提交回复
热议问题