ViewPager第一次使用正常,但重新加载后出现错误java.lang.IllegalStateException?

12

我有一个ViewPager,其中包含通过Web服务(JSON)获取的10张图片。一开始ViewPager工作得很流畅(好)。

但是当从活动返回并再次打开它时我遇到了这个错误:

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's 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's 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获取的解决方案,但无法工作。

我需要做哪些更改才能使其正常工作?

解决方案

之前我传递了ArrayList,但这次使用了字符串数组(可以工作)。我真的不知道ArrayList出了什么问题。


1
你应该展示更多的代码。也许你在其他地方修改了适配器。如果你使用了 ArrayAdapter,也许你没有注意到你修改了传递给适配器的 List - Michael Butscher
我没有使用ArrayAdapter,而是使用PagerAdapter来设置ViewPager上的所有图像。@MichaelButscher - Akarsh M
@MichaelButscher +1 这正是我的问题所在,非常感谢您的提示! - AgentKnopf
2个回答

13

问题的原因是在某些测量期间,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();
    }
}

祝你好运。


-1

他们给出的答案解决了我一个类似的问题。我只是在生产中,不知道所有这些代码是如何工作的,但是他们所说的在你的另一个线程中有点帮助。你必须像他们说的那样,在设置或删除图像的地方进行通知。

所以,我认为你的问题在于你必须在onCreateView()之后和destroyItem()中进行通知..我会在这里添加已经建议的解决方案..我想应该可以解决问题..希望我没有误导你..祝你好运..

     slideShowPager.getAdapter().notifyDataSetChanged();

td:lr; 可能在你的两个函数onCreateView()和destroyItem()的结尾加上那一行代码可以解决问题。


我曾经遇到过完全相同的问题。如果您真的无法解决这个问题,我至少可以展示我所做的事情,您可能会从中更好地理解,而不是我试图查看您的代码方式?我能看到的是,两个代码实现非常相似。提示-问题出在您的size();调用上,我将其放在try、catch块中,以便即使我犯了一个愚蠢的错误,它仍然会对其进行处理。 - vickzzzzz
早些时候我传递了ArrayList,但这次传递字符串数组(可行)......实际上我不知道ArrayList的问题在哪里@vickzzzzz - Akarsh M
如果它能工作的话,我想应该还不错吧。抱歉没能提供更多帮助,我只是作为一名实习生正在学习Android。 - vickzzzzz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接