RecyclerView рдореЗрдВ рдЦреАрдВрдЪреЗрдВ рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВред рднрд╛рдЧ 2: рдирд┐рдпрдВрддреНрд░рдХ, рдЧреНрд░рд┐рдб рдФрд░ рдХрд╕реНрдЯрдо рдПрдирд┐рдореЗрд╢рди рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ

RecyclerView рдореЗрдВ рдЦреАрдВрдЪреЗрдВ рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВред рднрд╛рдЧ 2: рдирд┐рдпрдВрддреНрд░рдХ, рдЧреНрд░рд┐рдб рдФрд░ рдХрд╕реНрдЯрдо рдПрдирд┐рдореЗрд╢рди рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ


рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ ItemTouchHelper рдФрд░ ItemTouchHelper.Callback рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ , рдЬреЛ RecyclerView рдореЗрдВ рдореВрд▓ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдФрд░ рд╕реНрд╡рд╛рдЗрдк-рдЯреВ- рдЖрдЙрдЯ рдлрдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдПрдХ рдореЗрдВ рдЧреНрд░рд┐рдб, рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрдВрдЯреНрд░реЛрд▓рд░, рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдФрд░ рдХрд╕реНрдЯрдо рд╕реНрд╡рд╛рдЗрдк рдПрдирд┐рдореЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдХрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рддрддреНрд╡реЛрдВ рдХрд╛ рдЬрд╛рд▓


рдирд┐рдпрдВрддреНрд░рдХ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ


рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╕рдордп, рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдЖрдЗрдЯрдо рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░рдХреЗ рдбреНрд░реЙрдк рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ "рд╕рдВрдкрд╛рджрди рдореЛрдб" рдореЗрдВ рд╕реВрдЪреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рд╣рдЬрддрд╛ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдордЧреНрд░реА рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рджреНрд╡рд╛рд░рд╛ рднреА рдЗрд╕рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ ред рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рд╣реИред


рдирд┐рдпрдВрддреНрд░рдХ рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддрддреНрд╡ рдХреЗ layout рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ( item_main.xml )ред


 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item" android:layout_width="match_parent" android:layout_height="?listPreferredItemHeight" android:clickable="true" android:focusable="true" android:foreground="?selectableItemBackground"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="16dp" android:textAppearance="?android:attr/textAppearanceMedium" /> <ImageView android:id="@+id/handle" android:layout_width="?listPreferredItemHeight" android:layout_height="match_parent" android:layout_gravity="center_vertical|right" android:scaleType="center" android:src="@drawable/ic_reorder_grey_500_24dp" /> </FrameLayout> 

рдбреНрд░реИрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдбрд┐рдЬрд╛рдЗрди рдЖрдЗрдХрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЖрдЗрдХрди рдЬрдирд░реЗрдЯрд░ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ItemTouchHelper.startDrag(ViewHolder) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдбреНрд░реИрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ ViewHolder рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯрдЪ рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ startDrag() рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред


рд╣рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


 public interface OnStartDragListener { /** * Called when a view is requesting a start of a drag. * * @param viewHolder The holder of the view to drag. */ void onStartDrag(RecyclerView.ViewHolder viewHolder); } 

рдлрд┐рд░ ItemViewHolder рдореЗрдВ рдбреНрд░реИрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ ImageView рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:


 public final ImageView handleView; public ItemViewHolder(View itemView) { super(itemView); // ... handleView = (ImageView) itemView.findViewById(R.id.handle); } 

рдФрд░ RecyclerListAdapter рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:


 private final OnStartDragListener mDragStartListener; public RecyclerListAdapter(OnStartDragListener dragStartListener) { mDragStartListener = dragStartListener; // ... } @Override public void onBindViewHolder(final ItemViewHolder holder, int position) { // ... holder.handleView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { mDragStartListener.onStartDrag(holder); } return false; } }); } 

RecyclerListAdapter рдХреЛ рдЕрдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ, рд╡рд╣ рд╣реИ OnStartDragListener рдХреЛ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛:


 public class RecyclerListFragment extends Fragment implements OnStartDragListener { // ... @Override public void onViewCreated(View view, Bundle icicle) { super.onViewCreated(view, icicle); RecyclerListAdapter a = new RecyclerListAdapter(this); // ... } @Override public void onStartDrag(RecyclerView.ViewHolder viewHolder) { mItemTouchHelper.startDrag(viewHolder); } } 

RecyclerListFragment рдХреЛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм, рдЬрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЫреВрдХрд░ рдЦреАрдВрдЪрдирд╛ рдФрд░ рдЫреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕реВрдЪреА рдЖрдЗрдЯрдо рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реИ


рдХрд┐рд╕реА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛


рдЕрдм рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдЗрдЯрдо рдХреЛ рдЦреАрдВрдЪреЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рджреГрд╢реНрдп рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред ItemTouchHelper рдХрд╛ рдЙрдкрдпреЛрдЧ ItemTouchHelper рдЖрдк рдорд╛рдирдХ рдЖрдЗрдЯрдо рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓реЙрд▓реАрдкреЙрдк рдФрд░ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░, рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддрддреНрд╡ рдкрд░ рдмреИрдХрд▓рд╛рдЗрдЯ "рдлреИрд▓рддрд╛ рд╣реИ"; рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░, рддрддреНрд╡ рдмрд╕ рдЕрдкрдирд╛ рд░рдВрдЧ рдмрджрд▓рдХрд░ рдХрд╛рд▓рд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИред


рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ ( background рд╕рдВрдкрддреНрддрд┐) рдХреЛ FrameLayout рддрддреНрд╡ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рдЗрд╕реЗ RecyclerListAdapter.ItemViewHolder рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


рддрддреНрд╡ рдЪрдпрди


рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдФрд░ рднреА рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ ViewHolder рдХрд┐рд╕реА рддрддреНрд╡ рдХреЗ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ ViewHolder рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, ItemTouchHelper.Callback рджреЛ рдФрд░ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


  • onSelectedChanged(ViewHolder, int) рд╣рд░ рдмрд╛рд░ рдХрд┐рд╕реА рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдбреНрд░реИрдЧ ( ACTION_STATE_DRAG ) рдпрд╛ рд╕реНрд╡рд╛рдЗрдк ( ACTION_STATE_SWIPE ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред view рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдХреНрд░рд┐рдп рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЖрджрд░реНрд╢ рд╕реНрдерд╛рди рд╣реИ ред
  • clearView(RecyclerView, ViewHolder) рдХреЛ рдбреНрд░реИрдЧ-рдПрдВрдб-рдбреНрд░реЙрдк view рдХрдВрдкреЛрдиреЗрдВрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ ( ACTION_STATE_IDLE ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЖрдкрдХреЗ view рдШрдЯрдХ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдЖрдорддреМрд░ рдкрд░ рдмрд╣рд╛рд▓ рдХреА рдЬрд╛рддреА рд╣реИред

рдЕрдм, рдЪрд▓реЛ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рдбрд╛рд▓ рджрд┐рдпрд╛ред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ ViewHolders рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ:


 /** * Notifies a View Holder of relevant callbacks from * {@link ItemTouchHelper.Callback}. */ public interface ItemTouchHelperViewHolder { /** * Called when the {@link ItemTouchHelper} first registers an * item as being moved or swiped. * Implementations should update the item view to indicate * it's active state. */ void onItemSelected(); /** * Called when the {@link ItemTouchHelper} has completed the * move or swipe, and the active item state should be cleared. */ void onItemClear(); } 

рдлрд┐рд░, SimpleItemTouchHelperCallback рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:


 @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { // We only want the active item if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { if (viewHolder instanceof ItemTouchHelperViewHolder) { ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; itemViewHolder.onItemSelected(); } } super.onSelectedChanged(viewHolder, actionState); } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); if (viewHolder instanceof ItemTouchHelperViewHolder) { ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; itemViewHolder.onItemClear(); } } 

рдЕрдм рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ RecyclerListAdapter.ItemViewHolder


 public class ItemViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder { // ... @Override public void onItemSelected() { itemView.setBackgroundColor(Color.LTGRAY); } @Override public void onItemClear() { itemView.setBackgroundColor(0); } } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдмрд╕ рдПрдХ рдЧреНрд░реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рддрддреНрд╡ рд╕рдХреНрд░рд┐рдп рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рдпрджрд┐ рдЖрдкрдХрд╛ ItemTouchHelper рдФрд░ рдПрдбреЙрдкреНрдЯрд░ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ItemTouchHelper.Callback рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реАрдзреЗ ItemTouchHelper.Callback рдореЗрдВ ItemTouchHelper.Callback ред ItemTouchHelper.Callback ред


рдЧреНрд░рд┐рдб


рдпрджрд┐ рдЕрдм рдЖрдк GridLayoutManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░рдг рдФрд░ рд╕рдорд╛рдзрд╛рди рд╕рд░рд▓ рд╣реИ: рд╣рдореЗрдВ рдЕрдкрдиреЗ ItemTouchHelper рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ SimpleItemTouchHelperCallback рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ:


 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragFlags, swipeFlags); } 

рдЧреНрд░рд┐рдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдХрдорд╛рддреНрд░ рдмрджрд▓рд╛рд╡ рдЙрдЪрд┐рдд рдЭрдВрдбреЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:


 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрд╡рд╛рдЗрдк-рдЯреВ-рдмрд░реНрдЦрд╛рд╕реНрдд рдХрд░рдирд╛ рдЧреНрд░рд┐рдб рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП swipeFlags рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реИ:


 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; int swipeFlags = 0; return makeMovementFlags(dragFlags, swipeFlags); } 

рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ GridLayoutManager рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, RecyclerGridFragment рджреЗрдЦреЗрдВред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЧреНрд░рд┐рдб рддрддреНрд╡


рдХрд╕реНрдЯрдо рдХрдбрд╝реА рдЪреЛрдЯ рдПрдирд┐рдореЗрд╢рди


ItemTouchHelper.Callback рдбреНрд░реИрдЧрд┐рдВрдЧ рдпрд╛ ItemTouchHelper.Callback рдХрд░рддреЗ рд╕рдордп рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ ItemTouchHelper рдПрдХ RecyclerView.ItemDecoration рд╣реИ , рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ view рдШрдЯрдХ рдХреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЗрд╕ рдкреНрд░рд╢реНрди рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм, рдЖрдЗрдП рд░реЗрдЦреАрдп рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрд╡рд╛рдЗрдк рдПрдиреАрдореЗрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВред


 @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { float width = (float) viewHolder.itemView.getWidth(); float alpha = 1.0f - Math.abs(dX) / width; viewHolder.itemView.setAlpha(alpha); viewHolder.itemView.setTranslationX(dX); } else { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } } 

dX рдФрд░ dY рдЪрдпрдирд┐рдд view рдШрдЯрдХ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд░реНрддрдорд╛рди рдкрд╛рд░реА рд╣реИрдВ, рдЬрд╣рд╛рдВ:


  • -1.0f рджрд╛рдИрдВ рд╕реЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдкреВрд░реНрдг рд╕реНрд╡рд╛рдЗрдк рд╣реИ ( ItemTouchHelper.END рд╕реЗ ItemTouchHelper.START )
  • 1.0f рдмрд╛рдИрдВ рдУрд░ рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдкреВрд░реНрдг рд╕реНрд╡рд╛рдЗрдк рд╣реИ ( ItemTouchHelper.START рд╕реЗ ItemTouchHelper.END )

рдХрд┐рд╕реА рднреА actionState рд▓рд┐рдП super рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХрд┐рд╕реА рддрддреНрд╡ рдХреА рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЗ рд╕рдордп рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред


рдирд┐рд╖реНрдХрд░реНрд╖


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ItemTouchHelper рдХреА рд╕реНрдерд╛рдкрдирд╛ рдмрд╣реБрдд рдордЬреЗрджрд╛рд░ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЖрдпрддрди рди рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИред


рд╕реНрд░реЛрдд рдХреЛрдб


Android- ItemTouchHelper- рдбреЗрдореЛ GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдЗрд╕ рд▓реЗрдЦ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦреЗрдВред рдпрд╣ рд▓реЗрдЦ ef8f149 рд╕реЗ d164fba рдкрд░ рдЖрддрд╛ рд╣реИ ред


Ler RecyclerView рдореЗрдВ рдЦреАрдВрдЪреЗрдВ рдФрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВред рднрд╛рдЧ 1: рдЖрдЗрдЯрдордЯрдЪ рд╣реЗрд▓реНрдкрд░

Source: https://habr.com/ru/post/hi428419/


All Articles