2013-07-22 10 views
12

10 görüntülü bir ViewPager'ım var, web servislerinden (JSON) geliyor, İlk başta ViewPager sorunsuz çalışıyor (ince).ViewPager ilk seferde iyi çalışıyor ancak tekrar yükleme yaparken, java.lang.IllegalStateException hatası alıyor musunuz?

ama ne zaman geri aktivitesinden ve tekrar açmayıbu hata var: Ana Etkinlik sınıfta

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 

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

çözüm için
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(); 
} 

} 

denedim:

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

//And 

slideShowPager.getAdapter().notifyDataSetChanged(); 

ben stackoverflow var ama işlemesi mümkün değil çözüm.

çalışmak için nelere ihtiyacım var?

Çözüm

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

+1

Daha fazla kod göstermelisiniz. Belki de adaptörü başka bir yerde de değiştirirsiniz. Eğer bir "ArrayAdapter" kullanırsanız, belki de farketmeden adaptöre verdiğiniz "List" 'ü değiştirdiniz –

+0

Bunun için Arrayadapter kullanmıyorum "PagerAdapter" ViewPager'daki tüm görüntüleri ayarlamak için kullanıyor @MichaelButscher –

+0

@MichaelButscher + 1 Benim durumumda sorun buydu, ipucu için çok teşekkür ederim! – AgentKnopf

cevap

-1

onlar sadece üretimde duyuyorum .. benim benzer bir sorun için çalışmış verdi cevabı, bütün bu kodlar nasıl çalıştığını hiçbir fikrim yok, ama onlar tür söylediklerini diğer iş parçamda bana yardım etti. Görüntülerinizi belirlediğiniz veya sildiğiniz yerlerde, söyledikleri gibi bildirmelisiniz.

Yani, bence burada sizin probleminiz onCreateView() 'dan sonra ve destroyItem()' inizde bir bildirim yapmalısınız. Zaten önerilen çözümü buraya eklerim. Bunu yapmalıyım sanırım. umarım seni yanlış anlamadım .. iyi şanslar .. iyi şanslar .. Bu iki satırdaki iki satırdakiCreateView() ve destroyItem() öğelerindeki satır sayısı

+1

çalışmıyor .. tekrar aynı hata meydana geldi –

+0

Ben aynı sorun vardı .. Eğer bu konu ile gerçekten ilerleyemiyorsanız, ben tam olarak ne yaptığımı gösterebilirim ve daha iyi anlamaya çalışıyorum kod yoluna bakmak için? Görebildiğim tek şey, her iki kod da birbirine çok benziyordu .. ipucu - sorun) (sizin boyutu ile olduğu; Hala bu konuda bir şeyler yapacağını, hatta ben derped ve aptal bir değişiklik yapmış, ben böylece bir try catch bloğu bunu koymak hangi diyoruz. – vickzzzzz

+0

önceki Sadece öğrenme .. .. eğer çalışırsa –

13

Sorunun nedeni olarak Pager'ın bazı ölçümler sırasında yenilenebilmesi ve bu durumda bağdaştırıcınızın sayısının yenilenmesi sayım kayıtlı sayıya eşit olmaz, hatayı görürsünüz. Bu yüzden benim çözüm görünüyor:

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(); 
    } 
} 

İyi şanslar.

İlgili konular