ViewPager Android рд╕рдкреЛрд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╕рднреА рд╕рд░рд▓рддрдо рд╣рд┐рдВрдбреЛрд▓рд╛, рдЬрд╣рд╛рдЬ рдкрд░ рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдЗрд╕ рдкрд░ рдмрдиреЗ рд╣реИрдВред рдлрд░рд╡рд░реА 2019 рдореЗрдВ, AndroidX рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдиреЗ ViewPager2 рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпреЗ рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ рдХреНрдпрд╛ рдереАрдВ рдФрд░ рдШрдЯрдХ рдХреЗ рдЕрджреНрдпрддрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХреНрдпрд╛ рдлрд╛рдпрджреЗ рд╣реИрдВред

рджреЗрдЦреЗрдВ рдкреЗрдЬрд░ реи
рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп (рдЬреБрд▓рд╛рдИ 2019),
ViewPager2 рдХрд╛ рдПрдХ рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг
рдЙрдкрд▓рдмреНрдз рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдиреАрдЪреЗ рдмрддрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реБрдЖ рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЯреИрдмрд▓реИрдпреВрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдмрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ), рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ, рдХрдИ рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдВред
рдПрдХреАрдХрд░рдг
рдШрдЯрдХ рдХреЛ рдорд╛рдирдХ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рд╢реНрд░реЗрдгреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
implementation "androidx.viewpager2:viewpager2:1.0.0-beta02"
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдЗрдП рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдкрд╣рд▓реА рд╕реЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рддрдХ рд╕рдВрдХреНрд░рдордг рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдФрд░ рдЖрдпрд╛рдд рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддрд╛ рд╣реИред рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖ рдЧрдпрд╛ рдерд╛:
getCurrentItem () рд╡рд┐рдзрд┐ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИ,
ViewPager2.onPageChangeCallback рдЖрдкрдХреЛ рдкреЗрдЬрд░
рд░рд╛рдЬреНрдп рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдПрдбреЗрдкреНрдЯрд░ рдЕрднреА рднреА
setAdapter () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
ред
рдпрд╣ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рдкреЗрдЬрд░реНрд╕ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред рд╕реЗрдЯ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд () рд╡рд┐рдзрд┐ рд╕рдВрджреЗрд╣ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рдЫреЛрдбрд╝рддреА рд╣реИ:
public final void setAdapter(@Nullable Adapter adapter) { mRecyclerView.setAdapter(adapter); }
рд╣рд╛рдВ, ViewPager2
RecyclerView рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдкреНрд▓рд╕ рд╣реИ, рджреВрд╕рд░реЗ рдкрд░ - рдпрд╣ рдПрдХ рд╕рд┐рд░рджрд░реНрдж рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдПрдХ рдкрддреНрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ
RecyclerView рдХреЛ рдЫрд┐рдкрд╛рдиреЗ PagerSnapHelper рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред рдпрд╣ рд╡рд░реНрдЧ рд╕реНрдХреНрд░реЙрд▓ рдХреЗ рднреМрддрд┐рдХреА рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ,
PagerSnapHelper рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╕реВрдЪреА рдЖрдЗрдЯрдо рд╕реВрдЪреА рдХреА рдХреЗрдВрджреНрд░ рд░реЗрдЦрд╛ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИ, рдФрд░ рдЪрд┐рдХрдиреА рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЗрдВрджреНрд░ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╕реНрд╡рд╛рдЗрдк рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬ рдерд╛, рддреЛ рд╕реВрдЪреА рдЕрдЧрд▓реЗ рддрддреНрд╡ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ - рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред
new PagerSnapHelper().attachToRecyclerView(mRecyclerView);

PagerSnapHelper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ RecyclerView рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ, рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рд╕рднреА ViewHolders, MATCH_PARENT рдкрд░ рд╕реЗрдЯ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, SnapHelper рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реЛрдЧрд╛, рдХреАрдбрд╝реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рд╕рдордп-рдЦрдкрдд рдХреЗ рдмрдЬрд╛рдп рдЫреЛрдЯреА рдКрдВрдЪрд╛рдИ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рд╣рд┐рдВрдбреЛрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрднрд╡ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
<androidx.viewpager2.widget.ViewPager2 android:id="@+id/main_pager" android:layout_width="match_parent" android:layout_height="match_parent" />
ViewPager2 рдХреЗ рд╕рдорд╛рди рдкреИрдХреЗрдЬ рдореЗрдВ
, рд╣рдо
рд╕реНрдХреНрд░реЙрд▓рдПрд╡реЗрдВрдЯ рдПрдбреЗрдкреНрдЯрд░ рд╡рд░реНрдЧ рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рд░рдВрддрд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╕реНрдХреНрд░реЙрд▓рдПрд╡реЗрдВрдЯ рдПрдбреЗрдкреНрдЯрд░ RecyclerView.OnScrollListener рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рдШрдЯрдирд╛рдУрдВ
рдХреЛ OnPageChangeCallback рдШрдЯрдирд╛рдУрдВ
рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред
@Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { if (mAdapterState != STATE_IN_PROGRESS_MANUAL_DRAG && newState == RecyclerView.SCROLL_STATE_DRAGGING) { ... dispatchStateChanged(SCROLL_STATE_DRAGGING); return; } ... }
рдЕрдм
OnPageChangeCallback рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛
рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ o
nPageSelected (Int) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдЬреЛ рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреГрд╖реНрда рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ):
main_pager.registerOnPageChangeCallback( object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) {
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╕реЗрдЯрдкреЗрдЬрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ () рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ
ViewPager2.PageTransformer рд▓реЗрддреА рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдЪрдпрди рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ
рдХреЙрд▓рдмреИрдХ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдиреАрдореЗрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдХреЙрд▓рдмреИрдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХрд╛
рджреГрд╢реНрдп рдЗрдирдкреБрдЯ рдФрд░ рдЙрд╕рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдмрд╕реЗ рдирд┐рдХрдЯрддрдо рдПрдирд╛рд▓реЙрдЧ
RecyclerView рдХрд╛
рдЖрдЗрдЯрдордПрдиреАрдореЗрдЯрд░ рд╣реИред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗ рдЧрдП:
рдХрдореНрдкреЛрдЬрд┐рдЯрдкреЗрдЬрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдФрд░
рдорд╛рд░реНрдЬрд┐рдирдкреЗрдЬ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ ред рдПрдХ рдореЗрдВ рдПрдХ рдкреЗрдЬрд░ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдмреАрдЪ рдЗрдВрдбреЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдпрд╛ рд╡рд┐рдЬреЗрдЯ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рдмрд╕
рд╕реЗрдЯрдСрд░рд┐рдиреЗрд╢рди () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреЗ рдкреЗрдЬрд░ рдХреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рд╕реНрд╡рд╛рдЗрдк рдХреЗ рд╕рд╛рде рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
main_pager.setOrientation(ViewPager2.ORIENTATION_VERTICAL)
рдпрд╣
рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рджреГрд╢реНрдп рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ: рд╣реБрдб рдХреЗ рддрд╣рдд,
рд▓реЗрдЖрдЙрдЯрдореИрдиреЗрдЬрд░ рдХреЗ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди
рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рд╕реВрдЪреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реМрдВрдкрдиреЗ рд╕реЗ рдирдП рдШрдЯрдХ рдХреЛ рдлрд╛рдпрджрд╛ рд╣реБрдЖ рд╣реИ: рдЗрд╕рдХреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдкрдардиреАрдп рдмрди рдЧрдИ рд╣реИред
рдпрд╣ рдорд╕реНрддреА рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдЕрджреНрдпрддрди рдореЗрдВ,
ViewPager2 рдХреЛ
ItemDecoration рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдорд┐рд▓рд╛: рдмрдЪреНрдЪреЗ рдХреЛ
рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧред рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрддреНрд╡реЛрдВ, рд╕реАрдорд╛рдУрдВ, рд╕реЗрд▓ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╕рд╛рд▓реЛрдВ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп
рд░рд┐рд╕рд╛рдЗрдХрд▓ рд╡реНрдпреВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЙрдирдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рд╡рд┐рдХрд╛рд╕ рдЕрдм рдкреЗрдЬрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рдкреЗрдЬрд░ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХрд╛ рдПрдХ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рд╣реИ:
main_pager.addItemDecoration( DividerItemDecoration(this, RecyclerView.HORIZONTAL) )
рдордИ 2019 рдореЗрдВ рдЕрдЧрд▓реЗ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде,
ViewPager2 рдиреЗ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рд╛:
setOffscreenPageLimit (Int) ред рд╡рд╣ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдХрд┐ рдХреЗрдВрджреНрд░реАрдп рдХреЗ рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рдХрд┐рддрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреЗрдЬрд░ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐
RecyclerView рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ
рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреБрдХреВрд▓рдХ
рдкрд╣рд▓реЗ рдкреЗрдЬрд░ рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рд╡реИрдЪрд╛рд░рд┐рдХ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА
FragmentStateAdapter рд╣реИ : рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдХреНрд▓рд╛рд╕ рдирд╛рдордХрд░рдг рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВред рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдордХрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрд╣рд▓реЗ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рдЕрдореВрд░реНрдд рдлрд╝рдВрдХреНрд╢рди
getItem (рд╕реНрдерд┐рддрд┐) рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рджрд┐рдП рдЧрдП рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд
рдлрд╝реНрд░реИрдЧреНрдореЗрдВрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕ рдирд╛рдордХрд░рдг рдХреА рджреЛ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЕрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░
рдлрд╝реНрд░реЗрдЧреНрдореЗрдВрдЯреЗрд╢рди (рд╕реНрдерд┐рддрд┐) рдмрдирд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЧреЗрдЯрдХрд╛рдЙрдВрдЯ () рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХреБрд▓ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ, рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рдЕрдм рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ
FragmentManager рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░, рдпрд╣ рдПрдХ
рдЬреАрд╡рдирдЪрдХреНрд░ рдпрд╛ рдХрд┐рд╕реА
рдЧрддрд┐рд╡рд┐рдзрд┐ рдпрд╛
рдлреНрд░реЗрдЧрдореЗрдВрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП,
saveState () рдФрд░
RestoreState () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред
FragmentViewHolder рд╡рд░реНрдЧ
RecyclerView рдХреЗ рдЕрдВрджрд░ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
OnCreateViewHolder () FragmentStateAdapter рдХреА рд╡рд┐рдзрд┐
FragmentViewHolder.create () рдХреЙрд▓ рдХрд░рддреА рд╣реИред
static FragmentViewHolder create(ViewGroup parent) { FrameLayout container = new FrameLayout(parent.getContext()); container.setLayoutParams( new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) ); container.setId(ViewCompat.generateViewId()); container.setSaveEnabled(false); return new FragmentViewHolder(container); }
рдЬрдм
onBindViewHolder () рд╡рд┐рдзрд┐ рдХреЛ
рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рддрддреНрд╡ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░
ViewHolder рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдЗрд╕рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдФрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
final long itemId = holder.getItemId(); final int viewHolderId = holder.getContainer().getId(); final Long boundItemId = itemForViewHolder(viewHolderId); ... mItemIdToViewHolder.put(itemId, viewHolderId); ensureFragment(position);
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЬрдм
ViewHolder рд╕реЗ
рджреГрд╢реНрдп рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ
FragmentTransaction рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ
Fragment рдЬреЛрдбрд╝рддреЗ рд╣реБрдП:
void placeFragmentInViewHolder(@NonNull final FragmentViewHolder holder) { Fragment fragment = mFragments.get(holder.getItemId()); ... scheduleViewAttach(fragment, container); mFragmentManager.beginTransaction() .add(fragment, "f" + holder.getItemId()) .setMaxLifecycle(fragment, STARTED) .commitNow(); ... }
рдЗрд╕ рдкреНрд░рдХрд╛рд░,
ViewPager2 рдХреЗ рджреЛ рдЙрдкрдпреЛрдЧ
рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВ : рдПрдбреЗрдкреНрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ рддреЛ рд╕реАрдзреЗ
RecyclerView.Adcape рд╕реЗ рдпрд╛
FragmentStateAdapter рд╕реЗ ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реЛрдЧрд╛: рдлреНрд░реИрдЧрдореЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рджреВрд╕рд░реЗ рдкреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рдЬрдм рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛ? рдмрдбрд╝реА рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░
ViewPager "рд╕рд┐рд▓реНрд╡рд░ рдмреБрд▓реЗрдЯ" рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдпрд╣ рдЪрд┐рддреНрд░реЛрдВ рдпрд╛ рдмреИрдирд░ рдХреЗ рд╕реНрдерд┐рд░ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╣рд┐рдВрдбреЛрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЬреНрдЮрд╛рдкрди рдкреЛрд╕реНрдЯреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб рдХрд░рддрд╛ рд╣реИ, рдлрд╝рд┐рд▓реНрдЯрд░ рд╣рд╛рд░реНрдб-рд╕рдкреЛрд░реНрдЯреЗрдб рдФрд░ рдмрджрд╕реВрд░рдд рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ
RecyclerView рдкрд░ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдПрдХ рдЬрд▓рддреА рд╣реБрдИ рдЗрдЪреНрдЫрд╛ рдореЗрдВ рдЖ рдЬрд╛рдПрдВрдЧреЗред рдЕрдм рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреЗрдЬрд░ рд╕реНрд╡рдпрдВ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛, рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реБрдП, рдЧрддрд┐рд╢реАрд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЙрдзрд╛рд░ рд▓реЗрддреЗ рд╣реБрдПред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ
рдкреЗрдЬрд░ рдПрдбреЗрдкреНрдЯрд░ рд╣рдореЗрдВ рдСрдлрд░ рдХрд░ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ
рдиреЛрдЯрд┐рдлрд╛рдЗрдбрдбрд╕реЗрдЯрдЪреЗрдВрдЬреНрдб () рд╡рд┐рдзрд┐, рдЬреЛ
рд╡реНрдпреВрдкреЗрдЬрд░ рдХреЛ рд╕рднреА рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реВрдЪреА рдЖрдЗрдЯрдо
рдХреЛ рдлрд┐рд░
рд╕реЗ рддреИрдпрд╛рд░
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИред рдЖрдк рдпрдереЛрдЪрд┐рдд рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░
POSITION_UNCHANGED рдХреЛ
getItemPosition () рд╡рд┐рдзрд┐ рд╕реЗ рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ
рд░реЛрдХ рд░рд╣рд╛ рд╣реИ, рдмрд╕ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдмрд▓реНрдХрд┐ рдмреЛрдЭрд┐рд▓ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрди рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬрдм рд╕реВрдЪреА рдореЗрдВ рддрддреНрд╡ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
FragmentStateAdapter рдореЗрдВ
RecyclerView.Adcape рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкреВрд░реНрдг рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
FragmentStateAdapter рдХреЗ рд╕рд╛рде
, рдЖрдк
рдбрд┐рдлреНрдпреВрдЯрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдХрд╛рдо рдХреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЪреЗрддрд╛рд╡рдиреА! рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП ... рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (InformDataSetChanged рдХреЛ рдЫреЛрдбрд╝рдХрд░), getItemId (Int) рдФрд░ c ontainsItem (рд▓реЙрдиреНрдЧ) рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ рдкрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд░реНрддрдорд╛рди рдХреЗ рдмрд╛рдж рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ getItemId рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ред Int рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
override fun getItemId(position: Int): Long { return items[position].toLong() } override fun containsItem(itemId: Long): Boolean { return items.contains(itemId.toInt()) }
ViewPager2 рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░рдиреЗ рдХреА рдЕрдирд┐рдЪреНрдЫрд╛ рд╣реИред рдПрдХ рдУрд░,
AndroidX рд╡рд┐рдХрд╛рд╕
рдЯреАрдо рдЕрдкреНрд░рдЪрд▓рд┐рдд
ViewPager рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИред рд╣рд╛рдБ, рдФрд░ рдХреНрдпреЛрдВ? рд╕рдм рдХреЗ рдмрд╛рдж,
RecyclerView рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рд╣рдЯрд╛рдирд╛ рдФрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╡рдлрд╛рджрд╛рд░реА рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рдПрдЧрд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
ViewPager2 рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдЧрдВрднреАрд░ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИред
рд╡рд┐рдкрдХреНрд╖
- рдирдореА рдФрд░ рдХреАрдбрд╝реЗ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ (рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣рд╛рдирд╛);
- рдирд┐рдХрдЯрддрд╛ред RecyclerView ViewPager2 рдХрд╛ рдПрдХ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдХрдИ рдЕрд╡рд╕рд░реЛрдВ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ: рд╕реНрд╡рд╛рдЗрдк-рдЯреВ-рдмрд░реНрдЦрд╛рд╕реНрдд рдХрд░рдирд╛ рдпрд╛ рдбреНрд░реИрдЧ-рдПрди-рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ ( ItemTouchHelper рд╕реАрдзреЗ RecyclerView рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ), рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ ItemAnimator рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдЖрдЙрдЯрдореИрди рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдФрд░ рдкреБрдирд░реНрдирд╡реАрдиреАрдХрд░рдг рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдШрдЯрдХ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ рдХреЗ рд╕рд╛рде, RecyclerView рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рд░рд╣реА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдЯрдордбреЗрдХреНрдпреВрд▓реЗрд╢рди ), рдФрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓рд╛рдкрддрд╛ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- RecyclerView рдХреЗ рд╕рднреА рдлрд╛рдпрджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред рдПрдбреЗрдкреНрдЯрд░ : рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди, рд╕реНрд╡рд╛рдЗрдк рдХреЗ рджреМрд░рд╛рди рддрддреНрд╡реЛрдВ рдХреЛ рд╕реАрдзреЗ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрджрд▓рддреЗ рд╕рдордп рд╕реВрдЪреА рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрдкреНрд░реЗрдХреНрд╖рдг;
- рдЕрдзрд┐рд╕реВрдЪрд┐рдд рдХреЗ рдкреВрд░реНрдг рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди ... рд╡рд┐рд╡рд░реНрддрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрдгрдирд╛;
- рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХреНрд░рдордг рдореЗрдВ рдЖрд╕рд╛рдиреА;
- рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░";
- RTL рд╕рдорд░реНрдерди;
- рд╕рдкреЛрд░реНрдЯ рдЖрдЗрдЯрдо ;
- рдирдХрд▓реА рд╕реНрдХреНрд░реЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди () ;
- рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛;
- рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддреИрдпрд╛рд░-рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЬреЛ рдХрд╕реНрдЯрдо RecyclerView.Adcape рд▓рд┐рдЦрддреЗ рд╕рдордп рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, EasyAdapter ред
рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐
ViewPager2 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ
рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИред рдпрд╣ рдПрдХ рдЖрд╢рд╛рдЬрдирдХ, рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдПрдХ
рдирдпрд╛ рд╡рд┐рдЬреЗрдЯ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИ, рдпрд╣ рдХрд╣рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ рдкреВрд░реНрдг рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд╛рдж рдпрд╣ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрдмрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрди рд╕рд╛рд╣рд╕реА рдФрд░ рдирд┐рд░реНрдгрд╛рдпрдХ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рд▓реЗрдЦ,
PagerSnapHelper рд╕рдорд░реНрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ 28 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк
ViewPager2 рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдХрд░ рдЕрдкрдиреЗ
RecyclerView рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
ViewPager2 рдФрд░
FragmentStateAdapter рдХрд╛ рдирдореВрдирд╛ рд╕рдВрдЪрд╛рд▓рдиред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рд░рд┐рд▓реАрдЬрд╝-рдиреЛрдЯреНрд╕ ViewPager2