2016-07-08 2 views
0

Я создаю приложение для Android, в котором пользователь может записывать изображения, и эти изображения отображаются в gridview. Когда пользователь хочет удалить одно или несколько изображений, коснувшись изображений i я получаю индекс java index of bounds exception. В примере, который я видел, использовался адаптер изображения, распространяющийся на arrayadapter, но я использую адаптер изображения, который распространяется на базовый адаптер. Поэтому я не знаю, из-за этого возникает ошибка.Ошибка индекса Java за пределами исключения для удаления нескольких изображений

grid.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 
     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 
      final int checkedCount = grid.getCheckedItemCount(); 
      mode.setTitle(checkedCount + " Selected"); 
      adapter.toggleSelection(position); 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      mode.getMenuInflater().inflate(R.menu.delete_mode, menu); 
      return true; 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { 
      return false; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.delete: 
        // Calls getSelectedIds method from ListViewAdapter Class 
        SparseBooleanArray selected = adapter 
          .getSelectedIds(); 
        // Captures all selected ids with a loop 

        for (int i = (selected.size() - 1); i >= 0; i--) { 
         if (selected.valueAt(i)) { 
           int selecteditem = (int) adapter 
            .getItem(selected.keyAt(i)); 
          //Remove selected items following the ids 


           String imgPath = listOfImagesPath.get(selecteditem); 
           File file=new File(imgPath); 
           file.delete(); 
          adapter.removeitem(selecteditem); 

         } 
        } 
        // Close CAB 
        mode.finish(); 
        return true; 
       default: 
        return false; 
      } 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode actionMode) { 
      adapter.removeSelection(); 
     } 
    }); 

адаптер Image (который я создал):

public class ImageListAdapter extends BaseAdapter 
{ 
    private Context context; 
    private List<String> imgPic; 
    private SparseBooleanArray mSelectedItemsIds; 
    public ImageListAdapter(Context c, List<String> thePic) 
    { 
     context = c; 
     imgPic = thePic; 
     mSelectedItemsIds = new SparseBooleanArray(); 
    } 
    public int getCount() { 
     if(imgPic != null) 
      return imgPic.size(); 
     else 
      return 0; 
    } 

    //---returns the ID of an item--- 
    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public void removeitem(int position){ 
     imgPic.remove(position); 
     notifyDataSetChanged(); 

    } 
    public void toggleSelection(int position) { 
     selectView(position, !mSelectedItemsIds.get(position)); 
    } 

    public void removeSelection() { 
     mSelectedItemsIds = new SparseBooleanArray(); 
     notifyDataSetChanged(); 
    } 

    public void selectView(int position, boolean value) { 
     if (value) 
      mSelectedItemsIds.put(position, value); 
     else 
      mSelectedItemsIds.delete(position); 
     notifyDataSetChanged(); 
    } 

    public int getSelectedCount() { 
     return mSelectedItemsIds.size(); 
    } 

    public SparseBooleanArray getSelectedIds() { 
     return mSelectedItemsIds; 
    } 

    //---returns an ImageView view--- 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ImageView imageView; 
     BitmapFactory.Options bfOptions=new BitmapFactory.Options(); 
     bfOptions.inDither=false;      //Disable Dithering mode 
     bfOptions.inPurgeable=true;     //Tell to gc that whether it needs free memory, the Bitmap can be cleared 
     bfOptions.inInputShareable=true;    //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future 
     bfOptions.inTempStorage=new byte[32 * 1024]; 
     if (convertView == null) { 
      imageView = new ImageView(context); 
      imageView.setLayoutParams(new GridView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
      imageView.setPadding(0, 0, 0, 0); 
     } else { 
      imageView = (ImageView) convertView; 
     } 
     FileInputStream fs = null; 
     Bitmap bm; 
     try { 
      fs = new FileInputStream(new File(imgPic.get(position).toString())); 

      if(fs!=null) { 
       bm=BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions); 
       imageView.setImageBitmap(bm); 
       imageView.setId(position); 
       imageView.setLayoutParams(new GridView.LayoutParams(200, 160)); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally{ 
      if(fs!=null) { 
       try { 
        fs.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return imageView; 
    } 
} 

адаптер изображения (пример, который я видел, для удаления нескольких изображений в сетке)

public class ListViewAdapter extends ArrayAdapter<WorldPopulation> { 
// Declare Variables 
Context context; 
LayoutInflater inflater; 
List<WorldPopulation> worldpopulationlist; 
private SparseBooleanArray mSelectedItemsIds; 

public ListViewAdapter(Context context, int resourceId, 
     List<WorldPopulation> worldpopulationlist) { 
    super(context, resourceId, worldpopulationlist); 
    mSelectedItemsIds = new SparseBooleanArray(); 
    this.context = context; 
    this.worldpopulationlist = worldpopulationlist; 
    inflater = LayoutInflater.from(context); 
} 

private class ViewHolder { 
    TextView rank; 
    TextView country; 
    TextView population; 
    ImageView flag; 
} 

public View getView(int position, View view, ViewGroup parent) { 
    final ViewHolder holder; 
    if (view == null) { 
     holder = new ViewHolder(); 
     view = inflater.inflate(R.layout.listview_item, null); 
     // Locate the TextViews in listview_item.xml 
     holder.rank = (TextView) view.findViewById(R.id.rank); 
     holder.country = (TextView) view.findViewById(R.id.country); 
     holder.population = (TextView) view.findViewById(R.id.population); 
     // Locate the ImageView in listview_item.xml 
     holder.flag = (ImageView) view.findViewById(R.id.flag); 
     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 
    // Capture position and set to the TextViews 
    holder.rank.setText(worldpopulationlist.get(position).getRank()); 
    holder.country.setText(worldpopulationlist.get(position).getCountry()); 
    holder.population.setText(worldpopulationlist.get(position) 
      .getPopulation()); 
    // Capture position and set to the ImageView 
    holder.flag.setImageResource(worldpopulationlist.get(position) 
      .getFlag()); 
    return view; 
} 

@Override 
public void remove(WorldPopulation object) { 
    worldpopulationlist.remove(object); 
    notifyDataSetChanged(); 
} 

public List<WorldPopulation> getWorldPopulation() { 
    return worldpopulationlist; 
} 

public void toggleSelection(int position) { 
    selectView(position, !mSelectedItemsIds.get(position)); 
} 

public void removeSelection() { 
    mSelectedItemsIds = new SparseBooleanArray(); 
    notifyDataSetChanged(); 
} 

public void selectView(int position, boolean value) { 
    if (value) 
     mSelectedItemsIds.put(position, value); 
    else 
     mSelectedItemsIds.delete(position); 
    notifyDataSetChanged(); 
} 

public int getSelectedCount() { 
    return mSelectedItemsIds.size(); 
} 

public SparseBooleanArray getSelectedIds() { 
    return mSelectedItemsIds; 
} 

Ошибка:

java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0 
     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
     at java.util.ArrayList.remove(ArrayList.java:403) 
     at nidhinkumar.gridcam.Cam$ImageListAdapter.removeitem(Cam.java:360) 
     at nidhinkumar.gridcam.Cam$4.onActionItemClicked(Cam.java:200) 
     at android.widget.AbsListView$MultiChoiceModeWrapper.onActionItemClicked(AbsListView.java:6693) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:3430) 
     at android.support.v7.view.SupportActionModeWrapper$CallbackWrapper.onActionItemClicked(SupportActionModeWrapper.java:168) 
     at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onActionItemClicked(AppCompatDelegateImplV7.java:1703) 
     at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onActionItemClicked(AppCompatDelegateImplV7.java:1703) 
     at android.support.v7.view.StandaloneActionMode.onMenuItemSelected(StandaloneActionMode.java:136) 

Я получаю это ошибка только тогда, когда я пытаюсь удалить изображение после захвата. Когда я снова загружу страницу и удалю изображение, оно отлично работает.

+0

SparseBooleanArray выбран = адаптер .getSelectedIds(); это не похоже на массив – Boola

+0

Возможный дубликат [java.lang.IndexOutOfBoundsException: недопустимый индекс 2, размер 2] (http://stackoverflow.com/questions/16460258/java-lang-indexoutofboundsexception-invalid-index- 2-size-is-2) –

ответ

0

Вы можете иметь проблемы здесь:

@Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.delete: 
       // Calls getSelectedIds method from ListViewAdapter Class 
       SparseBooleanArray selected = adapter 
         .getSelectedIds(); 
       // Captures all selected ids with a loop 

       for (int i = (selected.size() - 1); i >= 0; i--) { 

В этой строке

SparseBooleanArray selected = adapter 
         .getSelectedIds(); 

выбранного не является массивом. поэтому его размер всегда будет одним. и вы вычитаете 1 из него, тем самым делая свой размер 0. Поэтому он всегда будет указывать индекс массива вне связанного исключения, когда вы попытаетесь получить к нему доступ.

Простой физ может быть таким:

SparseBooleanArray[] selected = adapter 
         .getSelectedIds(); 
+0

Как исправить? – nick

+0

Нет, он не работает, все еще получая ту же ошибку – nick

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