
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ 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 { void onStartDrag(RecyclerView.ViewHolder viewHolder); }
рдлрд┐рд░ ItemViewHolder
рдореЗрдВ рдбреНрд░реИрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ ImageView
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
public final ImageView handleView; public ItemViewHolder(View itemView) { super(itemView);
рдФрд░ RecyclerListAdapter
рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:
private final OnStartDragListener mDragStartListener; public RecyclerListAdapter(OnStartDragListener dragStartListener) { mDragStartListener = dragStartListener;
RecyclerListAdapter
рдХреЛ рдЕрдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ, рд╡рд╣ рд╣реИ OnStartDragListener
рдХреЛ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛:
public class RecyclerListFragment extends Fragment implements OnStartDragListener {
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
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ:
public interface ItemTouchHelperViewHolder { void onItemSelected(); void onItemClear(); }
рдлрд┐рд░, SimpleItemTouchHelperCallback
рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
@Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
рдЕрдм рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ RecyclerListAdapter.ItemViewHolder
public class ItemViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder {
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдмрд╕ рдПрдХ рдЧреНрд░реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рддрддреНрд╡ рд╕рдХреНрд░рд┐рдп рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рдпрджрд┐ рдЖрдкрдХрд╛ 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: рдЖрдЗрдЯрдордЯрдЪ рд╣реЗрд▓реНрдкрд░