Search code examples
androidgridviewindexoutofboundsexception

Gridview ArrayIndexOutOfBoundsException crash


I don't see any problems with my gridview but when I run, it get crash without any errors in gradle build. here is my gridview main:

GridView grid;
public  boolean blablabla = true;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.first_frag, container, false);

    ArrayList<String> web = new ArrayList<String>();
    ArrayList<Integer> imageId = new ArrayList<Integer>();




    web.add("test");
    web.add("test");
    web.add("test");

    for (int i = 0; i < web.size(); i++) {
        switch (i) {
            case 0:
                if (blablabla== true) {
                    imageId.add(R.drawable.ic_luncher);
                } else {
                    imageId.add(R.drawable.ic_luncher);
                }
                break;
            case 1:
                if (lvl1 == true) {
                    //set image 1
                } else {
                    //set image 2
                }
                break;
            case 2:
                if (lvl2 == true) {
                    //set image 1
                } else {
                    //set image 2
                }
                break;
            default:

        }

    }





    CustomGrid adapter = new CustomGrid(getActivity(), web.toArray(new String[web.size()]), imageId.toArray(new Integer[imageId.size()]));
    grid=(GridView) v.findViewById(R.id.grid);
    grid.setAdapter(adapter);

adapter:

public class CustomGrid extends BaseAdapter{

    private Context mContext;
    private final String[] web;
    private final Integer[] Imageid;

    public CustomGrid(Context c, String[] web, Integer[] Imageid ) {
        mContext = c;
        this.Imageid = Imageid;
        this.web = web;
    }




    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return web.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View grid;
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {

            grid = new View(mContext);
            grid = inflater.inflate(R.layout.grid_single, null);
            TextView textView = (TextView) grid.findViewById(R.id.grid_text);
            ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
            textView.setText(web[position]);
            imageView.setImageResource(Imageid[position]);
        } else {
            grid = (View) convertView;
        }

        return grid;
    }
}

logcat:

FATAL EXCEPTION: main java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at example.examplee.com.newproject.CustomGrid.getView(CustomGrid.java:58) at android.widget.AbsListView.obtainView(AbsListView.java:2207) at android.widget.GridView.makeAndAddView(GridView.java:1341) at android.widget.GridView.makeRow(GridView.java:341) at android.widget.GridView.fillDown(GridView.java:283) at android.widget.GridView.fillFromTop(GridView.java:417) at android.widget.GridView.layoutChildren(GridView.java:1229)

Thanks


Solution

  • 1.the web 's length is 3 .So the Imageid 's length should be 3 .

    2.If the Imageid 's length is 1 ,it will cause ArrayIndexOutOfBoundsException in your code .

    So check your web length and Imageid length should be the same .

    Could you add all image ?

    for (int i = 0; i < web.size(); i++) {
            switch (i) {
                case 0:
                    if (blablabla== true) {
                        imageId.add(R.drawable.ic_luncher);
                    } else {
                        imageId.add(R.drawable.ic_luncher);
                    }
                    break;
                case 1:
                    if (lvl1 == true) {
                        //set image 1
                        imageId.add(R.drawable.ic_luncher);
                    } else {
                        //set image 2
                        imageId.add(R.drawable.ic_luncher);
                    }
                    break;
                case 2:
                    if (lvl2 == true) {
                        //set image 1
                        imageId.add(R.drawable.ic_luncher);
                    } else {
                        //set image 2
                        imageId.add(R.drawable.ic_luncher);
                    }
                    break;
                default:
    
            }
    }