2013-07-22 7 views
12

Ich habe einen ViewPager mit den 10 Bildern kommt durch Webservices (JSON), auf den ersten ViewPager funktioniert reibungslos (gut).ViewPager funktioniert beim ersten Mal, aber beim erneuten Laden, Fehler java.lang.IllegalStateException?

aber Wenn aus der Tätigkeit zurück und öffnen Sie es wiederIch habe diesen Fehler:

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 

In Hauptaktivitätsklasse

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

} 

Für Lösung, habe ich versucht:

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

//And 

slideShowPager.getAdapter().notifyDataSetChanged(); 

die Lösung, die ich von Stackoverflow bekam, konnte aber nicht.

was muss ich ändern, um zu arbeiten?

Lösung

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

+1

Sie sollten mehr Code zeigen. Vielleicht modifizierst du den Adapter auch woanders. Wenn Sie einen 'ArrayAdapter' verwenden, modifizieren Sie vielleicht die' List', die Sie an den Adapter übergeben haben, ohne es zu merken. –

+0

Ich verwende keinen Arrayadapter dafür. "PagerAdapter" benutzt für alle Bilder auf dem ViewPager @MichaelButscher –

+0

@MichaelButscher + 1 Das war das Problem in meinem Fall, vielen Dank für den Hinweis! – AgentKnopf

Antwort

-1

Die Antwort, die sie für ein ähnliches Problem von mir arbeitete gab .. ich in der Produktion gerade bin, haben keine Ahnung, wie all diese Codes funktionieren, aber was sie sagten Art hat mir in deinem anderen Thread geholfen. Sie müssen sich an den Orten melden, an denen Sie Ihre Bilder eingestellt oder gelöscht haben.

Also ich denke hier ist Ihr Problem, dass Sie eine Benachrichtigung nach Ihnen onCreateView() und auch in Ihrem destrojectItem() machen müssen .. Ich würde die bereits vorgeschlagene Lösung hier hinzufügen .. Ich denke, das sollte es tun. Ich hoffe, ich irre mich nicht .. viel Glück ..

 slideShowPager.getAdapter().notifyDataSetChanged(); 

td: lr; Diese Zeile in zwei Ihrer Funktionen OnCreateView() und DestroyItem() am Ende könnte den Trick

+1

nicht funktioniert .. wieder gleiche Fehler auftreten –

+0

Ich hatte genau das gleiche Problem .. Wenn Sie wirklich nicht in der Lage, mit diesem Problem voranzukommen, kann ich atleast zeigen, was ich genau tat, und Sie könnten besser davon verstehen, anstatt mich zu versuchen in deine Code-Art schauen? Alles, was ich sehen kann, ist, beide Codes wurden ziemlich ähnlich umgesetzt. Hinweis - das Problem ist mit Ihrer Größe(); ruf an, was ich in einen Versuch hineinlege, catch block, so dass, selbst wenn ich mich veräppelt habe und eine dumme Veränderung gemacht habe, würde es immer noch etwas dagegen tun. – vickzzzzz

+0

früher bin ich die ArrayList übergeben Aber dieses Mal String Array (arbeiten) ... Wirklich ich weiß nicht, was das Problem mit der ArrayList @ vickzzzzz –

13

Ursache des Problems der Pager kann während einer Messung aktualisiert werden und in diesem Fall aktualisiert Zahl Ihres Adapters, wenn dies Die Anzahl wird nicht mit der gespeicherten Anzahl übereinstimmen. Sie werden den Fehler sehen. So sieht meine Lösung aus:

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

Viel Glück.

Verwandte Themen