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

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -

How to provide Authorization & Authentication using Asp.net, C#? -