【问题标题】:ViewPager works Fine at first time but on reloading again, getting the error java.lang.IllegalStateException?ViewPager 第一次工作正常,但再次重新加载时,出现错误 java.lang.IllegalStateException?
【发布时间】:2013-07-22 09:51:00
【问题描述】:

我有一个 ViewPager,其中 10 张图片来自 webservices(JSON),起初 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 获得但无法工作的解决方案。

我需要改变什么才能工作

解决方案

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

【问题讨论】:

  • 您应该显示更多代码。也许您也在其他地方修改了适配器。如果您使用ArrayAdapter,也许您修改了您交给适配器的List,而没有注意到它
  • 我没有使用 Arrayadapter "PagerAdapter" 用于设置 ViewPager @MichaelButscher 上的所有图像
  • @MichaelButscher +1 这是我的问题,非常感谢您的提示!

标签: android android-viewpager


【解决方案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:lr;最后你的两个函数 onCreateView() 和 destroyItem() 中的那一行可能会成功

    【讨论】:

    • 我遇到了完全相同的问题。如果你真的无法解决这个问题,我至少可以展示我到底做了什么,你可能会从中更好地理解,而不是我试图看进入你的代码方式?我所看到的是,两个代码的实现都非常相似.. 提示 - 问题出在你的 size();我把它放在 try,catch 块中的调用,这样,即使我 derped 并做了一个愚蠢的改变,它仍然会做一些事情。
    • 之前我正在传递 ArrayList 但这次是 String Array(工作)......真的我不知道 ArrayList @vickzzzzz 有什么问题
    • 如果它有效.. 我想很好.. 抱歉帮不上.. 只是作为实习生学习 android
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2014-11-20
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多