2016-12-13 4 views
0

В настоящее время я использую вертикальный просмотрщик для одного из моих приложений. В настоящее время у меня есть задача сделать снимок и дать возможность удалить фотографию и вернуть ее обратно. Я могу захватить и добавить все фотографии, но когда я его удалю, элемент в этой позиции исчезает, но когда я прокручиваю вниз, я получаю исключение indexoutofbounds.Индекс за пределами исключения при попытке удалить элемент и прокрутку на ViewPager

Это мой код для адаптера:

private class BaseAdapterImpl extends PagerAdapter { 
    private View.OnClickListener mListener; 

    private final SimpleDateFormat mDateFormat; 

    private DisplayImageOptions options; 


    private TreeMap<Long, List<WashingPhoto>> mPhotoMapping; 

    private int mSize; 

    private Long[] mKeys; 

    List<List<WashingPhoto>> mPhotoList; 

    public BaseAdapterImpl(View.OnClickListener listener, Map<Long, List<WashingPhoto>> photoMap) { 
     //super(activity); 

     mListener = listener; 

     mDateFormat = new SimpleDateFormat("dd MMM yyyy"); 

     mPhotoMapping = new TreeMap<>(photoMap); 



     mSize = mPhotoMapping.size(); 


     mKeys = mPhotoMapping.keySet().toArray(new Long[mSize]); 




     options = new DisplayImageOptions.Builder() 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(false) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .showImageOnLoading(R.drawable.ic_main_logo) 
       .build(); 

    } 

    @Override 
    public int getCount() { 
     return mSize; 
    } 


    public List<WashingPhoto> getItem(int position) 
    { 

     return mPhotoMapping.get(mKeys[position]); 
    } 
    public List<WashingPhoto> removeItem(int position) 
    { 
     return mPhotoMapping.remove(mKeys[position]); 
    } 

    public void removeKeys(int position) 
    { 
ArrayList<Long> keys = new ArrayList<>(Arrays.asList(mKeys)); 
keys.remove(position); 
     } 



    @Override 
    public Object instantiateItem(ViewGroup container, final int position) 
    { 
     View inflate = getActivity().getLayoutInflater().inflate(R.layout.page_3shot, null); 
     container.addView(inflate); 
     ViewUtils.vuFind(inflate, R.id.layout_during).setVisibility(View.INVISIBLE); 

     mPhotoList = new ArrayList<List<WashingPhoto>>(mPhotoMapping.values()); 
     List<WashingPhoto> photos = mPhotoList.get(position); 

     int photoSize = photos.size(); 
     if (photoSize > 0) 
     { 
      PhotoType type = mTypes.get(Integer.parseInt(photos.get(0).washing_photo_type_id)); 
      if (type != null) 
      { 
       ViewUtils.vuSetText(inflate, type.type_name, R.id.photo_subject_type_display); 
      } else 
      { 
       ViewUtils.vuSetText(inflate, "", R.id.photo_subject_type_display); 
      } 


      ImageView imageView; 

      for (int i = 0; i < photoSize; i++) { 
       // int washingType = Integer.parseInt(photos.get(i).washing_photo_type_id); 
       int washingType = photos.get(i).photo_type; 

       switch (washingType) { 
        case 2: 
         imageView = (ImageView) inflate.findViewById(R.id.img_before); 
         imageView.setImageDrawable(null); 


         if (!TextUtils.isEmpty(photos.get(i).photo_url)) { 

          ImageLoader.getInstance().displayImage(photos.get(i).photo_url, imageView, options); 
         } 
         break; 

        case 4: 
         imageView = (ImageView) inflate.findViewById(R.id.img_after); 
         imageView.setImageDrawable(null); 
         if (!TextUtils.isEmpty(photos.get(i).photo_url)) { 

          ImageLoader.getInstance().displayImage(photos.get(i).photo_url, imageView, options); 
         } 
         break; 
       } 


       } 


     } 
     inflate.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(final View view) { 
       final List<WashingPhoto> items = (List<WashingPhoto>) mAdapter.getItem(mPagerShot.getCurrentItem()); 

       new AlertDialog.Builder(getActivity()). 
         setMessage("Delete this photo?"). 
         setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           if (items != null && items.size() > 0) { 
            for (int i = 0; i < items.size(); i++) { 
             WashingPhoto p = items.get(i); 
             items.remove(i); 
             mPhotos.remove(p); 
             p.delete(); 
             i--; 

            } 
            mAdapter.removeItem(position); 
            mAdapter.removeKeys(position); 
            notifyDataSetChanged(); 


            if(mAdapter.getCount()<=0){ 

             mGroupId = 0; 
             groupPhotos.clear(); 
             groupPhotos.keySet().clear(); 
            } 
           } 

          } 
         }).setNegativeButton("No", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
        } 
       }).create().show(); 

       return true; 
      } 
     }); 
     return inflate; 
    } 



    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 

     container.removeView((LinearLayout) object); 
    } 


    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((LinearLayout) object); 
    } 

    @Override 
    public int getItemPosition(Object object) { 

     return PagerAdapter.POSITION_NONE; 

    } 

Я попробовал решение, упомянутые в этом посте: [здесь] [1]

[1]: how to delete item from viewpager and pageradapter и до сих пор я получаю OOB исключение.

ответ

0

В методе getCount используйте непосредственно mPhotoMapping.size().

@Override 
public int getCount() { 
    return mPhotoMapping.size(); 
} 

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

+0

Это работало, или это все еще происходит? – bogdanN