ViewPager работает отлично в первый раз, но при повторной загрузке снова появляется ошибка java.lang.IllegalStateException?

У меня есть ViewPager с 10 изображениями, поступающими через webservices (JSON). Сначала ViewPager работает плавно (отлично).

, но вернувшись из операции и снова заново откройте его , я получил эту ошибку:

java.lang.IllegalStateException: The application PagerAdapter changed the adapter contents without calling PagerAdapter#notifyDataSetChanged! 

Expected adapter item count: 10, found: 0 Pager id: com.akm.demo.activities:id/slideShowPager Pager class: class android.support.v4.view.ViewPager 

В основном классе Activity

if (mSlideShowData != null) { // mSlideShowData is An ArrayList of the Images Which I pass to ImagePagerAdapter
adapter = new ImagePagerAdapter(getContext(), mSlideShowData);
slideShowPager.setAdapter(adapter);

//slideShowPager.invalidate();
((PagerAdapter)slideShowPager.getAdapter()).notifyDataSetChanged(); 
}

 else{
Toast toast = Toast.makeText(getContext(), "No Record Found", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
    toast.show();

ImagePagerAdapter.java

public class ImagePagerAdapter extends PagerAdapter {

private Context mContext;
private ImageLoader mImageLoader; // It use for downloading the image from server
private ArrayList<SlideShowData> slideShowImages; // In this I have all the detail of the image from  API

public ImagePagerAdapter(Context context, ArrayList<SlideShowData> mSlideShowData) {
    mContext = context;
    slideShowImages = mSlideShowData;
    mImageLoader = new ImageLoader(mContext);

}

@Override
public int getItemPosition(Object object) {
     return POSITION_NONE;
}

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

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



@Override
public Object instantiateItem(ViewGroup container, int position) {

    ImageView imageViewSlideShow = new ImageView(mContext);
    int padding = mContext.getResources().getDimensionPixelSize(R.dimen.padding_medium);
    imageViewSlideShow.setPadding(padding, padding, padding, padding);
    imageViewSlideShow.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    mImageLoader.DisplayImage(ServiceURLs.URL+"/photos/"+slideShowImages.get(position).photo_name, R.drawable.loading, imageViewSlideShow);
    ((ViewPager) container).addView(imageViewSlideShow, 0);
    return imageViewSlideShow;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((ImageView) object);

}

@Override
public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
}

}

Для решения я попытался:

@Override
public int getItemPosition(Object object) {
     return POSITION_NONE;
}

//And

slideShowPager.getAdapter().notifyDataSetChanged();

решение, которое я получил из stackoverflow, но не смог работать.

что мне нужно изменить для работы?

Решение

earlier I am Passing the ArrayList But this time String Array **(working )** Really I don't know whats the problem with the ArrayList

Ответ 1

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

public abstract class ViewPagerCursorAdapter extends PagerAdapter {

    private int mCount;

    public ViewPagerCursorAdapter(Context ctx, Cursor cursor, int resource) {
        super();
        ...
        mCount = cursor.getCount();
        ...
    }

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

    public Cursor swapCursor(Cursor newCursor) {
        ...
        mCount = newCursor.getCount();
        notifyDataSetChanged();
    }
}

Удачи.

Ответ 2

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

Итак, я думаю, здесь ваша проблема в том, что вам нужно сделать уведомление после того, как вы включите onCreateView(), а также в свой destroyItem(). Я бы добавил уже предлагаемое решение здесь. Думаю, это должно сделать это. надеюсь, что я не ошибаюсь вас.. удачи..

     slideShowPager.getAdapter().notifyDataSetChanged();

TD: Л.Р.; Эта строка в двух ваших функциях onCreateView() и destroyItem() в конце может сделать трюк