Aka*_*h M 12 android android-viewpager
我有一个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
Run Code Online (Sandbox Code Playgroud)
在主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();
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
为了解决方案,我试过:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
//And
slideShowPager.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
我从stackoverflow获得的解决方案但无法正常工作.
工作需要改变什么?
解
earlier I am Passing the ArrayList But this time String Array **(working )** Really I don't know whats the problem with the ArrayList
小智 13
问题的原因可以在某些测量期间刷新寻呼机,在这种情况下将刷新适配器的计数,如果此计数与保存的计数不相等,您将看到错误.所以我的解决方案是:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
祝好运.
小智 -1
他们给出的答案适用于我的类似问题。我只是在生产中,不知道所有这些代码是如何工作的,但他们所说的对我在你的另一个线程中有所帮助。您必须像他们所说的那样在您设置或删除图像的地方进行通知。
所以,我认为你的问题是你必须在 onCreateView() 和 destroyItem() 之后发出通知..我会在这里添加已经建议的解决方案..我想应该这样做..希望我是没有误导你..祝你好运..
slideShowPager.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
td:lr;最后,你的两个函数 onCreateView() 和 destroyItem() 中的那一行可能会起作用