рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреА рдмреИрдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реБрдирд╛ рдХрд┐ рдХреИрд╕реЗ
рд╣рдорд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ "рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ" рдФрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП "рдЕрдВрддрд╣реАрди" рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдПрдХ рдорд╕реМрджрд╛ рд▓реЗрдЦ рдмрдирд╛рдпрд╛ рдФрд░ рд▓рд┐рдЦрд╛, рдЬреЛ рд▓рдЧрднрдЧ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реЗрдХ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрджрд┐ рд╕рд╡рд╛рд▓ рдЙрдареЗрдВрдЧреЗ рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдПрдВрдЧреЗред
рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рдФрд░ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди
рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд░реВрдк рд╕реЗ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдПрдХ рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдЧрд╛ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
- рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ;
- рдпрджрд┐ рдХреИрд╢ рдЦрд╛рд▓реА рд╣реИ - рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦреЗрдВ;
- рдпрджрд┐ рдХреЛрдИ рдХреИрд╢ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ;
- рдпрджрд┐ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рд╕рд░рд▓реАрдХреГрдд: рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрд╢ рдХреЛ рдкрд╣рд▓реЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирдП рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреИрд╢ рдХрд╛ рдЕрдВрдд рд╣реЛрддрд╛ рд╣реИред
рдЕрдВрддрд╣реАрди рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣рдо рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ
рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдЬрдм рдХрдорд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╕реНрдХрд╛рдИрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм Realm рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдФрд░
рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╕реВрдЪрдирд╛рдПрдБ ред рд╣рдо рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
рд╢рд╛рдпрдж рд╣рдо рдкрд╣рд▓реА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИрдВ
рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдиреЗ рддреБрд░рдВрдд рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд┐рдХрд╛рд▓рд╛ -
рджрд╛рдпрд░реЗ рд░рд╛рдЬрд╢рд╛рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╣рдорд╛рд░реЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИ - рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдпрд╛ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдкрдирд╛ рдмрдирд╛рдирд╛ рдерд╛ред
рддреЛ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:
- рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ;
- рджрд╛рдпрд░реЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдмрдЪрд╛рдУ;
- рд╕реВрдЪрдирд╛рдПрдВ рд╕рд╣реЗрдЬреЗрдВ;
- рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд░рд╣ рд╣реА рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреЗрдЬрд┐рдВрдЧ рдХрд░реЗрдВред
рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╣рдо рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдорд╣рд╕реВрд╕ рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ:
DataSource - рдкреГрд╖реНрда рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧред
рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: PageKeyedDataSource, PositionalDataSource рдФрд░ ItemKeyedDataSource, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
PagedList - рдПрдХ рд╕реВрдЪреА, рдЬреЛ рдбреЗрдЯрд╛
рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмреИрдЪреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред
PagedListAdapter - рд╡рд░реНрдЧ рдЬреЛ PagedList рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд░реНрдХрд┐рдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
1. GetItem (int index) рд╡рд┐рдзрд┐ рдореЗрдВ PagedListAdapter, PagedList рдХреЗ рд▓рд┐рдП loadAround (int index) рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИ:
@SuppressWarnings("WeakerAccess") @Nullable public T getItem(int index) { if (mPagedList == null) { if (mSnapshot == null) { throw new IndexOutOfBoundsException( "Item count is zero, getItem() call is invalid"); } else { return mSnapshot.get(index); } } mPagedList.loadAround(index); return mPagedList.get(index); }
2. PagedList рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ tryDispatchBoundaryCallbacks (рдмреБрд▓рд┐рдпрди рдкреЛрд╕реНрдЯ) рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ:
public void loadAround(int index) { if (index < 0 || index >= size()) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size()); } mLastLoad = index + getPositionOffset(); loadAroundInternal(index); mLowestIndexAccessed = Math.min(mLowestIndexAccessed, index); mHighestIndexAccessed = Math.max(mHighestIndexAccessed, index); tryDispatchBoundaryCallbacks(true); }
3. рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рдЕрдиреБрд░реЛрдз рд╣реЛрддрд╛ рд╣реИ:
@SuppressWarnings("WeakerAccess") void tryDispatchBoundaryCallbacks(boolean post) { final boolean dispatchBegin = mBoundaryCallbackBeginDeferred && mLowestIndexAccessed <= mConfig.prefetchDistance; final boolean dispatchEnd = mBoundaryCallbackEndDeferred && mHighestIndexAccessed >= size() - 1 - mConfig.prefetchDistance; if (!dispatchBegin && !dispatchEnd) { return; } if (dispatchBegin) { mBoundaryCallbackBeginDeferred = false; } if (dispatchEnd) { mBoundaryCallbackEndDeferred = false; } if (post) { mMainThreadExecutor.execute(new Runnable() { @Override public void run() { dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd); } }); } else { dispatchBoundaryCallbacks(dispatchBegin, dispatchEnd); } }
4. рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рднреА рдХреЙрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдпрд╛ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
@SuppressWarnings("WeakerAccess") void dispatchBoundaryCallbacks(boolean begin, boolean end) {
рдЬрдмрдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ - рдмрд╕ рдЗрд╕реЗ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрд░реЗрдВред рдмрд╕ рд╡реНрдпрд╛рдкрд╛рд░:
- PagedList (RealmPagedList) рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВ рдЬреЛ RealmModel рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛;
- PagedStorage (RealmPagedStorage) рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдБ, рдЬреЛ OrderedRealmCollection рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛;
- DataSource (RealmDataSource) рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВ рдЬреЛ RealmModel рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛;
- RealmList рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдбрд╛рдкреНрдЯрд░ рдмрдирд╛рдПрдВ;
- рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рдХрд╛рд▓реЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдЬреЛрдбрд╝реЗрдВ;
- рд╣реЛ рдЧрдпрд╛ред
рд╣рдо рдорд╛рдореВрд▓реА рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ -
RealmPagination Library ред рдЖрдЗрдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
0. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛрдбрд╝реЗрдВ:
allprojects { repositories { maven { url "https://jitpack.io" } } } implementation 'com.github.magora-android:realmpagination:1.0.0'
1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
@Serializable @RealmClass open class User : RealmModel { @PrimaryKey @SerialName("id") var id: Int = 0 @SerialName("login") var login: String? = null @SerialName("avatar_url") var avatarUrl: String? = null @SerialName("url") var url: String? = null @SerialName("html_url") var htmlUrl: String? = null @SerialName("repos_url") var reposUrl: String? = null }
2. рдПрдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдмрдирд╛рдПрдБ:
class UsersListDataSourceFactory( private val getUsersUseCase: GetUserListUseCase, private val localStorage: UserDataStorage ) : RealmDataSource.Factory<Int, User>() { override fun create(): RealmDataSource<Int, User> { val result = object : RealmPageKeyedDataSource<Int, User>() { override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, User>) {...} override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, User>) { ... } override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, User>) { ... } } return result } override fun destroy() { } }
3. рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдмрдирд╛рдПрдБ:
class AdapterUserList( data: RealmPagedList<*, User>, private val onClick: (Int, Int) -> Unit ) : BaseRealmListenableAdapter<User, RecyclerView.ViewHolder>(data) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_user, parent, false) return UserViewHolder(view) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { ... } }
4. рдПрдХ ViewModel рдмрдирд╛рдПрдБ:
private const val INITIAL_PAGE_SIZE = 50 private const val PAGE_SIZE = 30 private const val PREFETCH_DISTANCE = 10 class VmUsersList( app: Application, private val dsFactory: UsersListDataSourceFactory, ) : AndroidViewModel(app), KoinComponent { val contentData: RealmPagedList<Int, User> get() { val config = RealmPagedList.Config.Builder() .setInitialLoadSizeHint(INITIAL_PAGE_SIZE) .setPageSize(PAGE_SIZE) .setPrefetchDistance(PREFETCH_DISTANCE) .build() return RealmPagedListBuilder(dsFactory, config) .setInitialLoadKey(0) .setRealmData(localStorage.getUsers().users) .build() } fun refreshData() { ... } fun retryAfterPaginationError() { ... } override fun onCleared() { super.onCleared() dsFactory.destroy() } }
5. рд╕реВрдЪреА рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:
recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = AdapterUserList(viewModel.contentData) { user, position ->
6. рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рдПрдБ:
class FragmentUserList : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = AdapterUserList(viewModel.contentData) { user, position -> ... } }
7. рд╣реЛ рдЧрдпрд╛ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ Realm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдХреНрд╖ рдХреА рддрд░рд╣ рд╕рд░рд▓ рд╣реИред рд╕рд░реНрдЧреЗрдИ рдиреЗ
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ
рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рджреВрд╕рд░реА рдмрд╛рдЗрдХ рдирд╣реАрдВ рдХрд╛рдЯрдиреА рд╣реЛрдЧреАред