Sunday, 15 April 2012

android - Reloading of ViewPager doesn't create first 3 fragments -



android - Reloading of ViewPager doesn't create first 3 fragments -

i have sherlockfragment's based fragment includes viewpager operating fragments via fragmentstatepageradapter. implemented "infinite" scroll, adaptor returns getcount() 1000. works. problem occurs when replace() main fragment main activity data, oncreateview of main fragment called during first initialization: recreate adaptor , set viewpager, run notifydatasetchanged() , set relevant view setcurrentitem(). @ point don't see fragment since getitem() not called. in case i'm swiping viewpager left or right, 3rd fragment middle showed , working, i.e. getitem() called during swiping:

@override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view view = inflater.inflate(r.layout.fragment_timebar, container, false); mpager = (viewpager)view.findviewbyid(r.id.timebar_pager); mtitleindicator = (titlepageindicator)view.findviewbyid(r.id.timebar_titles); mpageradapter = new myadapter(container.getcontext(), getsherlockactivity().getsupportfragmentmanager(), mpager); mpager.setadapter(mpageradapter); mpageradapter.setdate(mstartdate, mpageradapter.middle_position); homecoming view; } public class myadapter extends fragmentstatepageradapter { public final int full_count = 1000; private final int middle_position = full_count/2; private long mmiddlefragmentdate; private viewpager mviewpager; public myadapter(context context, fragmentmanager fragmentmanager, viewpager viewpager) { super(fragmentmanager); mmiddlefragmentdate = mstartdate; mviewpager = viewpager; } public long getmiddleposdate() { homecoming mmiddlefragmentdate; } private void refreshdata(int position) { log.d("timebar","@@@@@ refreshdata pos=" + position); mviewpager.setcurrentitem(position); notifydatasetchanged(); view localview = mviewpager.findviewwithtag(integer.valueof(position)); if (localview != null) { log.d("timebar","@@@@@ refreshdata localview found & != null"); localview.invalidate(); } mtitleindicator.notifydatasetchanged(); } public calendar getdatebyposition(int position) { calendar cal = calendar.getinstance(); cal.settimeinmillis(mmiddlefragmentdate); cal.add(calendar.day_of_year, (position - middle_position) * mnumofdaysperview); homecoming cal; } @override public void destroyitem(viewgroup viewgroup, int position, object object) { super.destroyitem(viewgroup, position, object); } @override public int getcount() { homecoming full_count; } @override public fragment getitem(int position) { gregoriancalendar cal = (gregoriancalendar)getdatebyposition(position); homecoming timebarfragment.newinstance(position, cal.gettimeinmillis(), mnumofdaysperview); } @override public int getitemposition(object paramobject) { homecoming position_none; } @override public charsequence getpagetitle(int position) { calendar cal = getdatebyposition(position); stringbuilder sb = new stringbuilder(); sb.append(mcalendarutils.getdayofmonth(cal)); sb.append(" "); if (mnumofdaysperview > 1) { sb.append(mcalendarutils.getmonthnameshort(cal)); } else { sb.append(mcalendarutils.getmonthnamelong(cal)); } if (mnumofdaysperview > 1) { sb.append(" - "); cal.add(calendar.day_of_year, mnumofdaysperview - 1); sb.append(mcalendarutils.getdayofmonth(cal)); sb.append(" "); sb.append(mcalendarutils.getmonthnameshort(cal)); } if (calnow.get(calendar.year) != cal.get(calendar.year)) { sb.append(","); sb.append(cal.get(calendar.year)); } homecoming sb.tostring(); } public void setdate(long date, int position) { mmiddlefragmentdate = date; refreshdata(position); } }

finally using of android-support-v13 library instead of android-support-v4 library , using getchildfragmentmanager() instead of getsupportfragmentmanager() solved these issues. now:

reloading main fragment causes reload of relevant fragments in pager (oncreateview() called)

there no problem instantiate more 1 instance of viewpager simultaneously.

android android-fragments android-viewpager viewpagerindicator

No comments:

Post a Comment