android - RecyclerView unwanted reloads -
i have recyclerview (vertical orientation) viewpager nested use scroll pictures horizontally.
suppose scroll horizontally on viewpager last picture. then, scroll recyclerviewand trigger loading of next items. here, pictures of viewpager go first picture.
how can prevent previous viewpager items going first picture when adapter receives notifydatasetchanged() ?
here sample project have put showcase this: https://github.com/alaouiali/bnbrecyclerview/
here code of recyclerview adapter , pageadapter
public class verticaladapter extends recyclerview.adapter<verticaladapter.viewholder> { /** * contains string used tag log.d */ private static final string tag = verticaladapter.class.getsimplename(); private context mcontext; private string[] urls = { "https://encrypted-tbn3.gstatic.com/images?q=tbn:and9gctqbvzfp5vuzdecuxydmqzkhbv8io9kc_sgdh6lb8t58zeutwfobw", "https://encrypted-tbn2.gstatic.com/images?q=tbn:and9gcr6yrcplyw6easj8r3hsv5pzmjwvrma1vzh9ex6-kepvgbvnmp1va", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gctk3k3mlj_rjqjuu3obj2k-javts4z-7eltadxt1k9q70kg3msd", "https://encrypted-tbn3.gstatic.com/images?q=tbn:and9gcsnd7v4htlkqb2bwuoujs6w0t9i0nfcc9fjl9n7j2hnpchszpuy", "https://encrypted-tbn2.gstatic.com/images?q=tbn:and9gcsx_ywo9qrv-tdpj6dw17tzgfx3hrzj47gclekcnnzbzh-cligbtw", "https://encrypted-tbn1.gstatic.com/images?q=tbn:and9gcqfslufkwkijbh9wds3icmljxxcfjngosikh7ru_g-gjkmz1dk_", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gcq_sjdcklzfz-am4hmj8fwqwlbbq8uie3c923izao2mcnde8dcw", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gcqjxskxwsam8fycwnd63sigsb6pmug3gkfmpojewteahuexrpsb", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gctwgwkskf3p4nuvboet_l75b_hgan_pnx-cnsuwochvgz-p2xgm", "https://c4.staticflickr.com/4/3366/4612778012_9c051789bf_b.jpg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gcrog9_j2rwxouzferhnz-lkqyhcuogevoddvmky9yoaj88lsc44", "https://encrypted-tbn2.gstatic.com/images?q=tbn:and9gcrxpm_ill1d-mvoq5yt2lthoxiqeu_h3_cdlkivmaoyf0gvnv7g", "https://encrypted-tbn1.gstatic.com/images?q=tbn:and9gcrltzhrzlugj-ezcosxvni-zmflqe4fu1jgfsmvqaazsdns_2mexw", "https://encrypted-tbn2.gstatic.com/images?q=tbn:and9gctkiujsy-pipsuta3mhfxad7zsg04m3ltw1ia1zkkjqnwkacistwg", "https://encrypted-tbn3.gstatic.com/images?q=tbn:and9gcrohycg7nogvdzdop2lbg37sk6wbhaypbfx_pbx4flbxtsm7z2u", "https://c2.staticflickr.com/6/5099/5513125478_89d1729e3c_b.jpg", "https://encrypted-tbn1.gstatic.com/images?q=tbn:and9gctybyinsozrasdwsbcyl5sdh8azyjdfvcjejphtka4yf43dafdknw", "https://encrypted-tbn1.gstatic.com/images?q=tbn:and9gcti7n06m_ahbfbkswh7slnc5ojee6j0usz-3mr5u_s8qa5swjkk", "https://encrypted-tbn1.gstatic.com/images?q=tbn:and9gcqugjxi8bnymstejcqhyqdl_8abhd_ucus0qeze8demczkzguhbta", "https://c3.staticflickr.com/7/6016/5984105136_7d5fa946b0_b.jpg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gctypbn6l7hw2_lw01e5birojnlfivis566cqeuiy9h_7y_kr2vxeq", "https://encrypted-tbn2.gstatic.com/images?q=tbn:and9gcs-b3znermvmlbun8idhoc4cz6qc0sbchbix6psffov_jssma4l", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gcrgcl15mygqfmdcgcmplxr00-a87ljvtuewufp2xg_xi82fhfc-wq", "https://c2.staticflickr.com/8/7251/6904099452_939e1ac5f2_b.jpg", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gcsmz_u5dklkmun4zbhiwwugz46g8avwa7ajmgoddicb9jf3lmaa", "https://encrypted-tbn1.gstatic.com/images?q=tbn:and9gcr_lgkmwloes9xzwjzzpz7klsp0oy5jtn-otamc7rley8ihvgyo", "https://encrypted-tbn0.gstatic.com/images?q=tbn:and9gcruzn6ke_rwtwvktu8ntnmw1q-rlnr3skevn0ito_q2mwsv9i0g" }; private list<childitem> createchilditems(int firstitem, int lastitem) { list<childitem> mydataset = new arraylist<>(); for(int i=firstitem; < lastitem; i++) { //log.d(tag, "firstitem: "+firstitem+" i: "+i+" lastitem: "+lastitem); mydataset.add(new childitem("number "+i, urls[i])); } return mydataset; } private static int mappwidth; private list<parentitem> mdataset; private list<childitem> mchilddataset; // provide reference views each data item // complex data items may need more 1 view per item, , // provide access views data item in view holder public static class viewholder extends recyclerview.viewholder { // each data item string in case public textview mtextview; public viewpager mviewpager; public viewholder(view v, context context) { super(v); mtextview = (textview) v.findviewbyid(r.id.text_bottom); mviewpager = (viewpager) v.findviewbyid(r.id.view_pager); int px = (int) typedvalue.applydimension(typedvalue.complex_unit_dip, 40, v.getresources().getdisplaymetrics()); mviewpager.getlayoutparams().height = (mappwidth - px); } } // provide suitable constructor (depends on kind of dataset) public verticaladapter(context context, list<parentitem> mydataset, int appwidth) { mdataset = mydataset; mcontext = context; mappwidth = appwidth; } // create new views (invoked layout manager) @override public verticaladapter.viewholder oncreateviewholder(viewgroup parent, int viewtype) { // create new view view v = layoutinflater.from(parent.getcontext()) .inflate(r.layout.vertical_view, parent, false); // set view's size, margins, paddings , layout parameters viewholder vh = new viewholder(v, mcontext); return vh; } // replace contents of view (invoked layout manager) @override public void onbindviewholder(final viewholder holder, int position) { // - element dataset @ position // - replace contents of view element holder.mtextview.settext(mdataset.get(position).gettext()); mchilddataset = createchilditems(position*3,(position*3)+3); imagepageradapter adapter = new imagepageradapter(mchilddataset); holder.mviewpager.setadapter(adapter); } // return size of dataset (invoked layout manager) @override public int getitemcount() { return mdataset.size(); } /** * imagepageradapter display images */ private class imagepageradapter extends pageradapter { list<childitem> mdata; public imagepageradapter(list<childitem> data) { mdata = data; } @override public object instantiateitem(viewgroup container, int position) { context context = mcontext; imageview mimageview = new imageview(context); mimageview.setscaletype(imageview.scaletype.center_crop); picasso.with(context) .load(mdata.get(position).geturl()) .placeholder(r.drawable.place_holder) .error(r.drawable.place_holder_error) .into(mimageview); ((viewpager) container).addview(mimageview, 0); return mimageview; } @override public void destroyitem(viewgroup container, int position, object object) { ((viewpager) container).removeview((imageview) object); } @override public boolean isviewfromobject(view view, object object) { return view == ((imageview) object); } @override public int getcount() { return mdata.size(); } } }
you need save state of each adapter in primary viewholder. try this. included relevant code easier understand.
private final int[] childpos; // provide suitable constructor (depends on kind of dataset) public verticaladapter(context context, list<parentitem> mydataset, int appwidth) { ... // assuming mydataset fixed size after // passed in. else u need implement variable list childpos = new int[mdataset.size()]; } // replace contents of view (invoked layout manager) @override public void onbindviewholder(final viewholder holder, int position) { viewpager pager = holder.mviewpager; pager.setadapter(adapter); // in case adapter count changes; childpos[position] = childpos[position] < adapter.count() ? childpos[position] : 0; final int trackpos = childpos[position]; pager.setcurrentitem(holder.pos); pager.addonpagechangelistener(new viewpager.onpagechangelistener() { @override public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { } @override public void onpageselected(int position) { trackpos = position; } @override public void onpagescrollstatechanged(int state) { } }); }
Comments
Post a Comment