android - Fragment remains on ViewPager after destroy -
i using fragmentstatepageradapter
multiple instances of same fragment
populate viewpager
. each fragment makes api call using retrofit
+ rxjava
load list items.
when switch tabs after current tab has finished loading items, alright. when switch tab while has not done fetching items yet, content of fragment
remains on viewpager
though corresponding life-cycle methods including ondestroyview
gets called.
mainactivity.java
public class mainactivity extends appcompatactivity { @bindview(r.id.toolbar) toolbar mtoolbar; @bindview(r.id.tab_layout) slidingtablayout mtablayout; @bindview(r.id.view_pager) viewpager mviewpager; @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); butterknife.bind(this); setsupportactionbar(mtoolbar); mainpageradapter adapter = new mainpageradapter(getsupportfragmentmanager(), getresources().getstringarray(r.array.titles)); mviewpager.setadapter(adapter); mtablayout.setviewpager(mviewpager); } }
mainpageradapter.java
public class mainpageradapter extends fragmentstatepageradapter { private string[] mtitles; public mainpageradapter(fragmentmanager fm, string[] titles) { super(fm); mtitles = titles; } @override public fragment getitem(int position) { return mainfragment.newinstance(mtitles[position]); } @override public charsequence getpagetitle(int position) { return mtitles[position]; } @override public int getcount() { return mtitles.length(); } }
mainfragment.java
public class mainfragment extends fragment { @bindview(r.id.swipe_refresh) swiperefreshlayout mswiperefresh; @bindview(r.id.recycler_view) recyclerview mrecyclerview; private unbinder munbinder; private itemsadapter madapter; private compositedisposable mcompositedisposable = new compositedisposable(); private string mtitle; public static mainfragment newinstance(string title) { mainfragment fragment = new mainfragment(); bundle args = new bundle(); args.putstring("title", title); fragment.setarguments(args); return fragment; } @override public void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); mtitle = getarguments().getstring("title"); } @nullable @override public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) { return inflater.inflate(r.layout.fragment_list, container, false); } @override public void onviewcreated(view view, @nullable bundle savedinstancestate) { munbinder = butterknife.bind(this, view); mswiperefresh.setonrefreshlistener(new swiperefreshlayout.onrefreshlistener() { @override public void onrefresh() { fetchitems(); } }); madapter = new itemsadapter(); mrecyclerview.sethasfixedsize(true); mrecyclerview.setadapter(madapter); mrecyclerview.setlayoutmanager(new linearlayoutmanager(getactivity())); mrecyclerview.setitemanimator(new defaultitemanimator()); mrecyclerview.additemdecoration(new divideritemdecoration(getactivity(), divideritemdecoration.vertical)); } @override public void onactivitycreated(@nullable bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); mswiperefresh.setrefreshing(true); fetchitems(); } @override public void ondestroyview() { super.ondestroyview(); munbinder.unbind(); } @override public void ondestroy() { super.ondestroy(); mcompositedisposable.clear(); } private void fetchitems() { requestinterface requestinterface = utils.createservice(); observable<response> observable; observable = requestinterface.getitems(mtitle); mcompositedisposable.add(observable .subscribeon(schedulers.io()) .observeon(androidschedulers.mainthread()) .subscribe(new consumer<response>() { @override public void accept(@nonnull response response) throws exception { madapter.swapitems(response.getposts()); mswiperefresh.setrefreshing(false); } }, new consumer<throwable>() { @override public void accept(@nonnull throwable throwable) throws exception { toast.maketext(getactivity(), "error: " + throwable.getlocalizedmessage(), toast.length_long).show(); mswiperefresh.setrefreshing(false); } })); } }
to exemplify situation, imagine first tab loading items. there text , icon indicating data loading. while it's loading, switch last tab supposing fragmentstatepageradapter
destroys first tab. if switch first tab, initiates , finishes loading of items text , icon previous destroyed fragment on top of screen!
Comments
Post a Comment