ViewPager 2 - рдкреБрд░рд╛рдиреЗ рдЖрд╡рд░рдг рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛

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) { //do your stuff } } ) 

рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╕реЗрдЯрдкреЗрдЬрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ () рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ 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

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


All Articles