android - Lazy loading ViewPagers in a ScrollView -
im trying inflate multiple viewpagers
scrollview
each viewpager
using fragmentstatepageradapter.
the viewpager
consist of fragments 3 imageviews
each page.
im using universalimageloader async loading of images cant lazy load work.
the problem when app inflating lets 10 viewpagers
3 imageviews
each trippleposterfragment1
, , 10 viewpagers
3 imageviews
trippleposterfragment2
since mpager.setoffscreenpagelimit(1)
kicks in.
its total of 60 async requests firing during progresslayout
visible.
my mainfragment
following method:
private void rendersubcarousels(arraylist<carousel> carousels) { layoutinflater minflater = (layoutinflater)getactivity().getsystemservice(context.layout_inflater_service); int = 1; linearlayout subcarousellayout = (linearlayout) mscrollview.findviewbyid(r.id.index_subcategory_carousel_container); (final carousel carousel : carousels) { relativelayout carouselwrapper = (relativelayout) minflater.inflate(r.layout.main_pager_layout, null); linearlayout mcontainer = (linearlayout) carouselwrapper.findviewbyid(r.id.main_pager_container); mcontainer.setid(constants.baseid_linearlayout + i); viewpager mpager = (viewpager) mcontainer.findviewbyid(r.id.main_pager); mpager.setid(constants.baseid_viewpager + i); mpager.setadapter(new pagerposteradapter(getfragmentmanager(),constants.triple_posters, carousel)); subcarousellayout.addview(carouselwrapper); i++; } progresslayout.setvisibility(view.gone); }
my fragmentstatepageradapter
:
public class pagerposteradapter extends fragmentstatepageradapter { private int mpagesize; private carousel mcarousel; public pagerposteradapter(fragmentmanager fm, int pagesize, carousel carousel) { super(fm); this.mpagesize = pagesize; this.mcarousel = carousel; } @override public int getcount() { int maxpageindex = (int) math.ceil((float) mcarousel.getassets().size() / mpagesize); return maxpageindex; } @override public fragment getitem(int position) { arraylist<asset> assets = mcarousel.getassets(); int = position*mpagesize; int = (position+1)*(mpagesize); if(to > assets.size()-1) = assets.size(); return (trippleposterfragment.newinstance(assets.sublist(from, to))); } }
the trippleposterfragment
imageview rendering happens:
private void initviews() { imageview mfirstimageview = (imageview) mlinearlayout.findviewbyid(r.id.first_pager_poster); imageview msecondimageview = (imageview)mlinearlayout.findviewbyid(r.id.second_pager_poster); imageview mthirdimageview = (imageview)mlinearlayout.findviewbyid(r.id.third_pager_poster); for(int = 0;i < assets.size(); i++){ imageview image = null; switch(i){ case 0: image = (imageview) mlinearlayout.findviewbyid(r.id.first_pager_poster); break; case 1: image = (imageview) mlinearlayout.findviewbyid(r.id.second_pager_poster); break; case 2: image = (imageview) mlinearlayout.findviewbyid(r.id.third_pager_poster); break; default: continue; } //the scrollview in mainfragment customscrollview mparentscrollview = (customscrollview)getactivity().findviewbyid(r.id.index_scrollviewparent); rect scrollbounds = new rect(); mparentscrollview.gethitrect(scrollbounds); if (image.getlocalvisiblerect(scrollbounds)) { // portion of imageview, single pixel, within visible window imageloader.getinstance().displayimage(assets.get(i).getposter(), image); system.out.println("im within"); else { // none of imageview within visible window system.out.println("im not within"); } } }
i need check if images visible , load them when are. system.out.println("im not within");
spammed in log
. im sure there way of doing similar this, need help.
i've tried quick approach of doing of meat inside listview not optimal, @ least after reading, viewpager inside listview
update
same core issue before, using new approach horizontallistviews instad of pagers.
listviews
seems way go. using arrayadapter
populate regular vertical listview
multiple hlistviews
lazy loads images vertically each new row, , horizontally each image inside, intended.
problem: horizontal positions lost. horizontaladapter
inherited recycled view onto next list item. positions new list item recycled list item was.
public view getview(int position, view convertview, viewgroup parent) { final viewholder holder; view view = convertview; if (view == null) { holder = new viewholder(); view = minflater.inflate(r.layout.carousel_frame_layout, null); holder.carousellist = (hlistview) view.findviewbyid(r.id.hlistview); view.settag(holder); } else { holder = (viewholder) view.gettag(); } carousel mcarousel = mdata.get(position); // problem: re-uses adapters convertview if (holder.carousellist.getadapter() == null) { subcategorycarouseladapter horizontaladapter = new subcategorycarouseladapter(mcontext, mcarousel.getassets()); holder.carousellist.setadapter(horizontaladapter); } else { ((subcategorycarouseladapter) holder.carousellist.getadapter()).update(mcarousel.getassets()); } return view; }
the solution save inner horizontaladapter
designated list item position, dont know how when hlistview
recycled.
update 3
found working solution hlistviews
. have still test if working viewpagers
.
its lazy loading images both horizontally , vertically when using addheaderview
on parent listview
each inner hlistview
. i´ve used horizontalvariablelistview universalimageloader carousels.
layoutinflater minflater = (layoutinflater) getactivity().getsystemservice (context.layout_inflater_service); (final carousel carousel : carousels) { view carouselwrapper = minflater.inflate(r.layout.carousel_sub_category_layout, null); listview.addheaderview(carouselwrapper); listview.setadapter(null); hlistview horizontallist = (hlistview) carouselwrapper.findviewbyid(r.id.hlistview); subcategorycarouseladapter madapter = new subcategorycarouseladapter(getactivity(), carousel.getassets()); horizontallist.setadapter(madapter); }
why not use listview instead of scrollview? has function of recycling views, loading start pagers visible on screen right now. otherwise should subclass scrollview in order check if pager visible right now
Comments
Post a Comment