android - RecyclerView drag & drop via itemTouchHelper bahaving strange when dragging fast -


i've been following guide link "drag , swipe recyclerview - ipaulpro" , having few problems on situations.

so, did explained + added textview in item represents position of item in recyclerview, this: enter image description here

everything appears nice except when start "sling shooting" items fast, have 2 problems:

  1. it happens have duplicate of numbers. enter image description here

    also did using notifyadaptersetchanged() in onitemclear() method - fixed in way, caused illegalstateexception, catched - lead indexoutofbounds exception.

  2. ocasionally,when swiped fast, item gets in "background". can seen if items not same size. enter image description here

i paste whole adapter code below, there must flaw somewhere in it.

layoutinflater inflater; context context; androidentityquestionresult androidentityquestionresult; arraylist<androidentityanswer> list = new arraylist<>(); ordlayoutmanagerquestion ord; screendimensionsconstants sdc;   public orderingrecycleadapter(context context, androidentityquestionresult androidentityquestionresult, ordlayoutmanagerquestion ord) {     inflater = layoutinflater.from(context);     this.context = context;     this.list = androidentityquestionresult.getandroidentityquestion().getentityanswer();     this.androidentityquestionresult = androidentityquestionresult;     this.ord = ord;     sdc = new screendimensionsconstants(context); }  @override public recyclerview.viewholder oncreateviewholder(viewgroup parent, int viewtype) {     view view = inflater.inflate(r.layout.custom_row_ordering_rv, parent, false);     final recyclerview.viewholder holder = new orderingviewholder(view);     return holder; }   @override public void onbindviewholder(recyclerview.viewholder holder, int position) {     if (holder instanceof orderingviewholder) {          ((orderingviewholder) holder).answertext.settext(list.get(position).getanswer().getanswer_text());         int currentposition = position + 1;         ((orderingviewholder) holder).position.settext("#" + currentposition);     } }  @override public int getitemcount() {     return list.size(); }  @override public boolean onitemmove(int fromposition, int toposition) {     if (fromposition < toposition) {         (int = fromposition; < toposition; i++) {             collections.swap(list, i, + 1);         }     } else {         (int = fromposition; > toposition; i--) {             collections.swap(list, i, - 1);         }     }     notifyitemmoved(fromposition, toposition);     notifyitemchanged(fromposition);     return true; }  @override public void onitemdismiss(int position) {  }  @override public void onstartdrag(recyclerview.viewholder viewholder) {         ord.getitemtouchhelper().startdrag(viewholder); }  class orderingviewholder extends recyclerview.viewholder implements itemtouchhelperviewholder {     private textview answertext;     private imageview pin;     private textview position;      public orderingviewholder(view itemview) {         super(itemview);         answertext = (textview) itemview.findviewbyid(r.id.orderinganswer);         answertext.settextsize(typedvalue.complex_unit_px, sdc.getheight() / 40);          pin = (imageview) itemview.findviewbyid(r.id.ordering_pin);         pin.getlayoutparams().width = sdc.getheight() / 15;         pin.getlayoutparams().height = sdc.getheight() / 15;          pin.setontouchlistener(new view.ontouchlistener() {             @override             public boolean ontouch(view v, motionevent event) {                 if (motioneventcompat.getactionmasked(event) ==                         motionevent.action_down) {                     orderingrecycleadapter.this.onstartdrag(orderingviewholder.this);                 }                 return false;             }         });         position = (textview) itemview.findviewbyid(r.id.answer_position);         position.settextsize(typedvalue.complex_unit_px, sdc.getheight() / 40);      }      @override     public void onitemselected() {         itemview.setbackgroundresource(r.drawable.menu_item_background_ice_blue);     }      @override     public void onitemclear() {         itemview.setbackgroundresource(r.drawable.menu_item_background_white);         int currentposition = getlayoutposition() + 1;         position.settext("#" + currentposition);        //notifydatasetchanged();      } } 

bonus question

is there tutorial or info related drag , drop between 2 recyclerviews?

i know there question on so, no answer, may luckier here.

change onitemmove method

@override public boolean onitemmove(int fromposition, int toposition) {     if (fromposition < toposition) {         (int = fromposition; < toposition; i++) {             collections.swap(list, i, + 1);         }     } else {         (int = fromposition; > toposition; i--) {             collections.swap(list, i, - 1);         }     }     notifyitemmoved(fromposition, toposition);     notifyitemchanged(fromposition);     return true; } 

to:

@override public boolean onitemmove(int fromposition, int toposition) {     if (fromposition < toposition) {         (int = fromposition; < toposition; i++) {             collections.swap(list, i, + 1);         }     } else {         (int = fromposition; > toposition; i--) {             collections.swap(list, i, - 1);         }     }     notifyitemmoved(fromposition, toposition);     return true; } 

Comments

Popular posts from this blog

java - pagination of xlsx file to XSSFworkbook using apache POI -

Unlimited choices in BASH case statement -

apache - How do I stop my index.php being run twice for every user -