рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдПрдВрдбреНрд░реЙрдЗрдб рдбрд┐рдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреА рдмреИрдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реБрдирд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рдорд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ "рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ" рдФрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП "рдЕрдВрддрд╣реАрди" рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдорд╕реМрджрд╛ рд▓реЗрдЦ рдмрдирд╛рдпрд╛ рдФрд░ рд▓рд┐рдЦрд╛, рдЬреЛ рд▓рдЧрднрдЧ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реЗрдХ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрджрд┐ рд╕рд╡рд╛рд▓ рдЙрдареЗрдВрдЧреЗ рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдПрдВрдЧреЗред

рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рдФрд░ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди


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

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

  • рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ;
  • рдпрджрд┐ рдХреИрд╢ рдЦрд╛рд▓реА рд╣реИ - рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦреЗрдВ;
  • рдпрджрд┐ рдХреЛрдИ рдХреИрд╢ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ;
  • рдпрджрд┐ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рд╕рд░рд▓реАрдХреГрдд: рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрд╢ рдХреЛ рдкрд╣рд▓реЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдирдП рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдХреИрд╢ рдХрд╛ рдЕрдВрдд рд╣реЛрддрд╛ рд╣реИред

рдЕрдВрддрд╣реАрди рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рд╣рдо рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рдЬрдм рдХрдорд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╕реНрдХрд╛рдИрд▓рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм Realm рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╕реВрдЪрдирд╛рдПрдБ ред рд╣рдо рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред

рд╢рд╛рдпрдж рд╣рдо рдкрд╣рд▓реА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИрдВ


рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдиреЗ рддреБрд░рдВрдд рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд┐рдХрд╛рд▓рд╛ - рджрд╛рдпрд░реЗ рд░рд╛рдЬрд╢рд╛рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╣рдорд╛рд░реЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИ - рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдпрд╛ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдкрдирд╛ рдмрдирд╛рдирд╛ рдерд╛ред

рддреЛ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:

  1. рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ;
  2. рджрд╛рдпрд░реЗ рдХреЗ рд▓рд┐рдП рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдмрдЪрд╛рдУ;
  3. рд╕реВрдЪрдирд╛рдПрдВ рд╕рд╣реЗрдЬреЗрдВ;
  4. рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рддрд░рд╣ рд╣реА рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреЗрдЬрд┐рдВрдЧ рдХрд░реЗрдВред

рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рд╣рдо рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреЗрдЬрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдорд╣рд╕реВрд╕ рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ:

DataSource - рдкреГрд╖реНрда рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреГрд╖реНрда рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╡рд░реНрдЧред
рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: PageKeyedDataSource, PositionalDataSource рдФрд░ ItemKeyedDataSource, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред

PagedList - рдПрдХ рд╕реВрдЪреА, рдЬреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмреИрдЪреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред
PagedListAdapter - рд╡рд░реНрдЧ рдЬреЛ PagedList рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд░реНрдХрд┐рдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

1. GetItem (int index) рд╡рд┐рдзрд┐ рдореЗрдВ PagedListAdapter, PagedList рдХреЗ рд▓рд┐рдП loadAround (int index) рд╡рд┐рдзрд┐ рдХрд╣рддрд╛ рд╣реИ:

/** * Get the item from the current PagedList at the specified index. * <p> * Note that this operates on both loaded items and null padding within the PagedList. * * @param index Index of item to get, must be >= 0, and < {@link #getItemCount()}. * @return The item, or null, if a null placeholder is at the specified position. */ @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 (рдмреБрд▓рд┐рдпрди рдкреЛрд╕реНрдЯ) рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ:

 /** * Load adjacent items to passed index. * * @param index Index at which to load. */ 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); /* * mLowestIndexAccessed / mHighestIndexAccessed have been updated, so check if we need to * dispatch boundary callbacks. Boundary callbacks are deferred until last items are loaded, * and accesses happen near the boundaries. * * Note: we post here, since RecyclerView may want to add items in response, and this * call occurs in PagedListAdapter bind. */ tryDispatchBoundaryCallbacks(true); } 

3. рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рдЕрдиреБрд░реЛрдз рд╣реЛрддрд╛ рд╣реИ:

 /** * Call this when mLowest/HighestIndexAccessed are changed, or * mBoundaryCallbackBegin/EndDeferred is set. */ @SuppressWarnings("WeakerAccess") /* synthetic access */ 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") /* synthetic access */ void dispatchBoundaryCallbacks(boolean begin, boolean end) { // safe to deref mBoundaryCallback here, since we only defer if mBoundaryCallback present if (begin) { //noinspection ConstantConditions mBoundaryCallback.onItemAtFrontLoaded(mStorage.getFirstLoadedItem()); } if (end) { //noinspection ConstantConditions mBoundaryCallback.onItemAtEndLoaded(mStorage.getLastLoadedItem()); } } 

рдЬрдмрдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ - рдмрд╕ рдЗрд╕реЗ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрд░реЗрдВред рдмрд╕ рд╡реНрдпрд╛рдкрд╛рд░:

  1. PagedList (RealmPagedList) рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВ рдЬреЛ RealmModel рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛;
  2. PagedStorage (RealmPagedStorage) рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдБ, рдЬреЛ OrderedRealmCollection рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛;
  3. DataSource (RealmDataSource) рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВ рдЬреЛ RealmModel рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛;
  4. RealmList рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдбрд╛рдкреНрдЯрд░ рдмрдирд╛рдПрдВ;
  5. рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рдХрд╛рд▓реЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдЬреЛрдбрд╝реЗрдВ;
  6. рд╣реЛ рдЧрдпрд╛ред

рд╣рдо рдорд╛рдореВрд▓реА рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ - 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдХреНрд╖ рдХреА рддрд░рд╣ рд╕рд░рд▓ рд╣реИред рд╕рд░реНрдЧреЗрдИ рдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рджреВрд╕рд░реА рдмрд╛рдЗрдХ рдирд╣реАрдВ рдХрд╛рдЯрдиреА рд╣реЛрдЧреАред

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


All Articles