1

Я пытаюсь сохранить Arraylist в моем методе SharedPreferences. Проблема я получаю, что мой индекс выходит за рамки, но я не понимаю, почему:Sharedpreferences error index за пределами

@Override 
public void onPause() { 
    super.onPause(); // Always call the superclass method first 
    data = getSharedPreferences(filename,0); 
    SharedPreferences.Editor editor0 = data.edit(); 
    editor0.putInt("shareddifficulty", difficulty); 
    editor0.putInt("sharedmoves", moves); 
    editor0.putInt("sharedpicture",resource); 
    editor0.putInt("ID_size", ID.size()); 

    for(int i=0;i<ID.size();i++){ 
     editor0.remove("ID_"+i); 
     editor0.putInt("ID_" + i, ID.get(i)); 
    } 
    editor0.commit();    
} 

public void onResume(){ 
    super.onResume(); 
    data = getSharedPreferences(filename,0); 
    difficulty = data.getInt("shareddifficulty", 0); 
    moves = data.getInt("sharedmoves",0); 
    int listsize = data.getInt("ID_size", 0); 
    resource = data.getInt("sharedpicture", 0); 
    for(int i=0; i < listsize;i++){ 
     ID.set(i,data.getInt("ID_" + i,0)); 
    } 
    for(int i=0;i<listsize;i++){ 
     crops.set(ID.get(i),cropsshuffle.get((ID.get(i)))); 
    } 

} 

cropslist и список ID имеют одинаковый размер. Потому что это очень важно знать, как ArrayLists выглядеть я собираюсь показать коды для сельскохозяйственных культур и код ID:

культур:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), resource); 

    //Cropping the images and making a ID list that coincide with the cropped images. 

    divideImages(bmp); 

с

private void divideImages(Bitmap bmp) { 

    int width = bmp.getWidth(); 
    float w_ratio = (float) w/width; 
    int scaledwidth = (int) (bmp.getWidth()*w_ratio); 
    int scaledheight = (int) (bmp.getHeight()*w_ratio); 
    Bitmap scaledbmp = Bitmap.createScaledBitmap(bmp,scaledwidth,scaledheight,true); 

    switch(difficulty){ 
     case 0: 
      for(int i=0;i<3;i++){ 
       for(int j=0;j<3;j++){ 
        if(i==2 && j==2){ 
         Bitmap cropimage = Bitmap.createBitmap(scaledwidth/3,scaledheight/3,Bitmap.Config.ARGB_8888); 
         crops.add(cropimage); 
         cropimage = null; 
        } 
        else{ 
         int startx = (int) ((scaledwidth*j)/3); 
         int starty = (int) ((scaledheight*i)/3); 
         Bitmap croppimage = Bitmap.createBitmap(scaledbmp,startx,starty,scaledwidth/3,scaledheight/3); 
         crops.add(croppimage); 
         croppimage = null; 
        } 
       } 
       grd.setNumColumns(3); 
      } 
      break;         
     case 1: 
      for(int i=0;i<4;i++){ 
       for(int j=0;j<4;j++){ 
        if(i==3 && j==3){ 
         Bitmap croppimage = Bitmap.createBitmap(scaledwidth/4,scaledheight/4,Bitmap.Config.ARGB_8888); 
         crops.add(croppimage); 
         croppimage = null; 
        } 
        else{ 
         int startx = (int) ((scaledwidth*j)/4); 
         int starty = (int) ((scaledheight*i)/4); 
         Bitmap croppimage = Bitmap.createBitmap(scaledbmp,startx,starty,scaledwidth/4,scaledheight/4); 
         crops.add(croppimage); 
         croppimage = null; 
        } 
       } 
       grd.setNumColumns(4); 
      } 
      break; 
     case 2: 
      for(int i=0;i<5;i++){ 
       for(int j=0;j<5;j++){ 
        if(i==4 && j==4){ 
         Bitmap croppimage = Bitmap.createBitmap(scaledwidth/5,scaledheight/5,Bitmap.Config.ARGB_8888); 
         crops.add(croppimage); 
         croppimage = null; 
        } 
        else{ 
         int startx = (int) ((scaledwidth*j)/5); 
         int starty = (int) ((scaledheight*i)/5); 
         Bitmap croppimage = Bitmap.createBitmap(scaledbmp,startx,starty,scaledwidth/5,scaledheight/5); 
         crops.add(croppimage); 
         croppimage = null; 
        } 
       } 
       grd.setNumColumns(5); 
      } 
      break; 
    } 
} 

и для список ID:

private void getID(){ 
    for(int i=0;i<crops.size();i++){ 
     ID.add(i); 
    } 
} 

В моей GridView я есть onitemclicklistener, который меняет свои позиции, если поменять местами плитки сельскохозяйственных культур и удостоверения личности.

+2

Вы также должны опубликовать инициализацию массивов и популяцию, с предоставленным кодом мы не можем быть уверены, что происходит – Leonardo

+0

Это немного сложно сделать, потому что функция довольно длинная, вам нужно знать только одно: урожаи - это аррайалист растровых изображений, а идентификатор - это список с целыми числами и имеет тот же размер, что и урожай. –

+0

Я могу поставить код так же хорошо, если вы действительно этого хотите? –

ответ

-2

Из приведенного выше кода я не могу сказать, где ошибка.

Но IndexOutofBoundsException возникает, когда вы пытаетесь получить доступ к элементу в своем Array, который не находится внутри вашего массива.

Пример:

String[] myArray = new String[10]; 
myArray[10] = "test"; 

Это решает в IndexOutofBoundsException, так как ваш массив только из 0-9.

Основываясь на приведенном выше примере ошибки, попробуйте выяснить, что происходит в коде. В противном случае добавьте более конкретный код, поскольку, как вы можете видеть, ваша ошибка вращается вокруг вашего Array.

1

Я сделал библиотеку, чтобы облегчить этот вид задачи, просто включить мой LIB:

compile 'com.cesarferreira.quickutils:library:2.2.1' 

Init него:

QuickUtils.init(context); 

затем сохранить/читать/легко удалить в любом месте вы хотите:

QuickUtils.prefs.save(key, value); 
QuickUtils.prefs.getInt(key, defaultValue); 
QuickUtils.prefs.remove(key); 

Вся документация here

Смежные вопросы