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: 
everything appears nice except when start "sling shooting" items fast, have 2 problems:
it happens have duplicate of numbers.

also did using
notifyadaptersetchanged()inonitemclear()method - fixed in way, causedillegalstateexception, catched - leadindexoutofboundsexception.ocasionally,when swiped fast, item gets in "background". can seen if items not same size.

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
Post a Comment