android - java.lang.IllegalStateException in the ViewPager after data update -


i exception when dinamically add data viewpager

02-07 19:21:24.488 5577-5577/com.jamesb.encoderyapp e/androidruntime: fatal exception: main process: com.jamesb.encoderyapp, pid: 5577 java.lang.illegalstateexception: application's pageradapter changed adapter's contents without calling pageradapter#notifydatasetchanged! expected adapter item count: 4, found: 8 pager id: com.jamesb.encoderyapp:id/pager pager class: class android.support.v4.view.viewpager problematic adapter: class com.jamesb.encoderyapp.adapters.viewpageradapter @ android.support.v4.view.viewpager.populate(viewpager.java:1000) @ android.support.v4.view.viewpager.populate(viewpager.java:952) @ android.support.v4.view.viewpager$3.run(viewpager.java:251) @ android.view.choreographer$callbackrecord.run(choreographer.java:767) @ android.view.choreographer.docallbacks(choreographer.java:580) @ android.view.choreographer.doframe(choreographer.java:549) @ android.view.choreographer$framedisplayeventreceiver.run(choreographer.java:753) @ android.os.handler.handlecallback(handler.java:739) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:135) @ android.app.activitythread.main(activitythread.java:5254) @ java.lang.reflect.method.invoke(native method) @ java.lang.reflect.method.invoke(method.java:372) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:903) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:698)

i data api - 3 pictures,when pictures swiped, call getcontent() method again , in moment illegalstateexception .

 try {         restclient.getinstance(getactivity()).getcontent(date, new callback() {             @override             public void onfailure(request request, ioexception e) {                 e.printstacktrace();             }              @override             public void onresponse(response response) throws ioexception {                 string json = response.body().string();                  gsonbuilder gsonbuilder = new gsonbuilder();                 mgson = gsonbuilder.create();                 jsonparsed = mgson.fromjson(json, jsonparsed.class);                 if (jsonparsed != null) mapoddata.add(jsonparsed);                 if (count < iteration) {                     count++;                     getcontent();                 } else {                     new handler(looper.getmainlooper()).post(new runnable() {                         @override                         public void run() {                                  madapter = new viewpageradapter(getactivity(), mapoddata);                                 mviewpager.setadapter(madapter);                                 madapter.notifydatasetchanged();                         }                     });                 }             }         });     } catch (exception e) {         e.printstacktrace();     } 

view pager adapter

public class viewpageradapter extends pageradapter {  private activity mactivity; private arraylist<jsonparsed> mapoddata = new arraylist<>(); private utils mutils;  public viewpageradapter(activity activity, arraylist<jsonparsed> mapoddata) {     this.mactivity = activity;     this.mapoddata = mapoddata;     mutils = new utils(); }  @override public int getcount() {     return mapoddata.size(); }  @override public int getitemposition(object object) {     return position_unchanged; }  @override public boolean isviewfromobject(view view, object object) {     return view == object; }  @override public view instantiateitem(final viewgroup container, final int position) {      layoutinflater inflater = (layoutinflater) mactivity.getsystemservice(context.layout_inflater_service);     final view itemview = inflater.inflate(r.layout.item, container, false);     final viewholder viewholder = new viewholder();     viewholder.mpic = (imageview) itemview.findviewbyid(r.id.picture);     viewholder.mpictitle = (textview) itemview.findviewbyid(r.id.pictitle);     viewholder.mdescription = (textview) itemview.findviewbyid(r.id.description);     itemview.settag(viewholder);      jsonparsed item = mapoddata.get(position);     string descr = item.explanation;     string title = item.title;     string picurl = item.hdurl;     viewholder.mpictitle.settext(title);     viewholder.mdescription.settext(descr);      picasso.with(mactivity)             .load(string.valueof(picurl))             .into(viewholder.mpic);      viewholder.mpic.setonclicklistener(new view.onclicklistener() {         @override         public void onclick(view v) {             mutils.setimageaswallpaper(mactivity, viewholder.mpic);         }     });     container.addview(itemview);     return itemview; }  @override public void destroyitem(viewgroup collection, int position, object view) {     ((viewpager) collection).removeview((view) view);  }  static class viewholder {     imageview mpic;     textview mpictitle;     textview mdescription; } 

}

i've seen similar questions in google ,but don't understand did not use notifydatasetchanged() , throws exception.

it looks adapter sharing list reference activity/fragment. means is: when line executes

                if (jsonparsed != null) mapoddata.add(jsonparsed); 

the list in adapter updated immediately since same list.

while viewpager doing thing, references adapter again , again. checks getcount() , adapter haven't changed in order stay internally consistent.

the best way fix this? if know how many pages end with, have getcount() method return number. thing can have adapter create own list , mlist.addall() on list activity. set viewpager adapter null while retrieving data server.


Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -