рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХреБрдЫ Android рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реЗ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рдЕрднреА рддрдХ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд╕рдХрддреА рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХрд╣рд╛рдиреА рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ
рдЙрдирдХреЗ рдкрд╛рд╕ рдХреИрд╕реЗ
рдЖрдпрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ:- рд╣рдо RecyclerView рдФрд░ RecyclerView.Adcape рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ
- рдПрдВрдбреНрд░реЙрдЗрдб рдЬреЗрдЯрдкреИрдХ рд╕реЗ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (рд╡реИрдХрд▓реНрдкрд┐рдХ, рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдмрд┐рдирд╛)
- рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП - рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдХрд▓реНрдк;)
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рддреЛ рдареАрдХ рд╣реИ! рд╕рднреА рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ListView рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдП рд╣реИрдВ рдФрд░ RecyclerView (
Rv ) рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рдЙрди рд╕рдордпреЛрдВ рдореЗрдВ рдЬрдм рд╣рдордиреЗ
ViewHolder рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
рдерд╛ рдЦреБрдж рд╡рд┐рд╕реНрдорд░рдг рдореЗрдВ рдбреВрдм рдЧрдП рд╣реИрдВред
рдЖрд░рд╡реА рд╣рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
LayoutManagers рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЪрдпрдиред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рд╕реНрдХреНрд░реАрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдареАрдХ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ
рд╡реНрдпреВрдмреЛрд░реНрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред
рд╣рдореЗрдВ Google I / O рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХреА
рдХрд╣рд╛рдиреА рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░
рд╕реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИредрд▓реЗрдХрд┐рди, рд╣рдореЗрд╢рд╛ "рдмрдЯреНрд╕!" рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реЛрддреА рд╣реИ .. рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рдорд╛рдирдХ рдЙрддреНрддрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдХреЙрдкреА рдкреЗрд╕реНрдЯ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЬрд╣рд╛рдВ рдПрдбреЙрдкреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд┐рд▓рд╣рд╛рд▓,
рдЖрд░рд╡реА рдкрд╣рд▓реЗ
рд╕реЗ рд╣реА рддреАрди рд╕рд╛рд▓ рдХрд╛ рд╣реИред рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдФрд░ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрдврд╝рд╛рдИ рдХрд░рддреЗ рд╣реИрдВ - рдФрд░ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
рдкреНрд░рд╛рдЪреАрди рд╣реЙрд░рд░ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдирд╣реАрдВред рдХрд▓реНрдкрдирд╛? рдЗрди рддреАрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдиреЗ рдЕрдВрддрддрдГ рдХреЛрдЯрд▓рд┐рди = рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЖрд░рд╡реА рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдП рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп
рдЖрдкрдХреА рдмрд╛рдЗрдХ рдХреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рд╕реЗ рдЖрдзрд╛рд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИ, рдирдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ред рдЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рддрд░реНрдХ рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛ рддреНрдпрд╛рдЧрдХрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рдФрд░ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ - рдЖрдкрдХреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдлреИрд╕рд▓реЗ рд╕реЗ рдмрдВрдзреЗ рдмрд┐рдирд╛ рдЬрд░реВрд░рдд рд╣реИред
рдЖрдЗрдП рд╢реБрд░реВ рд╕реЗ рд╣реА рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рд╕рд╣реА рд╕реЛрдЪреЗрдВ
рдШрдЯрдХ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
, рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
, рди рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ , рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрд░реНрдХ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдмрдирддрд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж - рдПрдХ рд╡рд░реНрдЧ рдЬреЛ рдЕрдореВрд░реНрдд рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдореИрдВ рдмреБрдирд┐рдпрд╛рджреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЙрд╕реА рджрд┐рд╢рд╛ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ - рдпреЛрдЬрдирд╛ рдпрд╣ рд╣реИ:
рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ -> рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдЬреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд▓реЗрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) -> рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ ред рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдЖрдк RecyclerView.Adcape рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рдорд┐рд▓реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рддрд░реАрдХреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
IBaseListAdapterinterface IBaseListAdapter<T> { fun add(newItem: T) fun add(newItems: ArrayList<T>?) fun addAtPosition(pos : Int, newItem : T) fun remove(position: Int) fun clearAll() }
* рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рдХрдИ рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП getItemByPos (рд╕реНрдерд┐рддрд┐: Int), рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдмрд▓рд┐рд╕реНрдЯ (startIndex: Int, endIndex: Int)ред рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ: рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рддрдкрд╕реНрдпрд╛ рдЖрдкрдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд░реНрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА, рдЬреЛ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рд▓рдЧрддреА рд╣реИрдВред рдЬреЗрдиреЗрд░рд┐рдХ
рдЯреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ
ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдбрд╛рдкреНрдЯрд░ рд╕реВрдЪреА рдХреЗ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ (рдЖрдЗрдЯрдо) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ - рд╣рдордиреЗ рдЕрднреА рддрдХ рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рдЪреБрдирд╛ рд╣реИред рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╣реЛрдВрдЧреЗ, рдкрд╣рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
interface IBaseListItem { fun getLayoutId(): Int }
рдЦреИрд░, рд╣рд╛рдВ, рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ - рд╣рдо рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдореЗрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрдк рд▓реЗрдЖрдЙрдЯрдЖрдИрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╢рд╛рдпрдж рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреА, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЕрдзрд┐рдХ
рдЙрдиреНрдирдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рд▓реЗрддреЗред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рд╣реИ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдпрд╛ рд░реИрдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдо рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЕрдиреБрднрд╡? YouTube рдкрд░ рдореЗрд░реЗ рд╕рднреА рд▓рд┐рдВрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рд╕рдордп рдирд╣реАрдВ рд╣реИ - рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ рдФрд░ рдкрдврд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд░рд▓ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
рдЖрд░рд╡реА рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдХрд╛рдо рдХреЗ рд╕рд╛рде,
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП , рдКрдкрд░ рдЬреЛ рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рд╣реИ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдирд┐рд╣рд┐рддред
рдпрд╣ рд╣рдорд╛рд░реЗ
IBaseListAdapter рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЧрдардмрдВрдзрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдФрд░ рдирд┐рдореНрди рд╡рд░реНрдЧ рдЕрдореВрд░реНрдд рд╣реЛрдЧрд╛:
SimpleListAdapter abstract class SimpleListAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>(), IBaseListAdapter<IBaseListItem> { protected val items: ArrayList<IBaseListItem> = ArrayList() override fun getItemCount() = items.size override fun getItemViewType(position: Int) = items[position].layoutId protected fun inflateByViewType(context: Context?, viewType: Int, parent: ViewGroup) = LayoutInflater.from(context).inflate(viewType, parent, false) override fun add(newItem: IBaseListItem) { items.add(newItem) notifyDataSetChanged() } override fun add(newItems: ArrayList<IBaseListItem>?) { for (newItem in newItems ?: return) { items.add(newItem) notifyDataSetChanged() } } override fun addAtPosition(pos: Int, newItem: IBaseListItem) { items.add(pos, newItem) notifyDataSetChanged() } override fun clearAll() { items.clear() notifyDataSetChanged() } override fun remove(position: Int) { items.removeAt(position) notifyDataSetChanged() } }
* рдиреЛрдЯ: рдУрд╡рд░рд░рд╛рдЗрдб
getItemViewType (рд╕реНрдерд┐рддрд┐: Int) рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдзреНрдпрд╛рди
рджреЗрдВ ред рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА int рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ Rv рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ ViewHolder рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ
рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП
рд╡реИрд▓ рд▓реЗрдЖрдЙрдЯрдЖрдИрдб рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рд╣рд░ рдмрд╛рд░ рд╕рд╣рд╛рдпрдХ рд░реВрдк рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреА рдЖрдИрдбреА рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдорд╛рди рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ - рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдорд╛рд░реЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП "
рдЗрдирд╡реЙрдПрдЯ "
рдЖрдЗрдЯрдо рд╡реНрдпреВ рдореЗрдВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐
рдЗрдирдлреНрд▓реЗрдЯрдмрд╛рдпрдЯрд╛рдЗрдк () рд╡рд┐рдзрд┐ (рдЕрдЧрд▓реА рд▓рд╛рдЗрди) рдореЗрдВ рд╣реИред
рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реНрдХреНрд░реАрди рд▓реЗрдВред рдПрдВрдбреНрд░реЙрдЗрдб рд╣рдореЗрдВ
рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореИрдВ рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рднрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдРрд╕рд╛ рдорд╛рдорд▓рд╛:

рд╣рдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реВрдЪреА рдЖрдЗрдЯрдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП
SimpleListAdapter рдФрд░
Rv рдпрд╣рд╛рдВ рдкрд░рд┐рдкреВрд░реНрдг рд╣реИрдВ!
рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ! рдЖрдк item'ov рдХреЗ рд▓реЗрдЖрдЙрдЯ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
item_info.xml; item_switch.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="56dp"> <TextView android:id="@+id/tv_info_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="28dp" android:textColor="@color/black" android:textSize="20sp" tools:text="Balance" /> <TextView android:id="@+id/tv_info_value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|end" android:layout_marginEnd="48dp" tools:text="1000 $" /> </FrameLayout> <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="56dp"> <TextView android:id="@+id/tv_switch_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="28dp" android:textColor="@color/black" android:textSize="20sp" tools:text="Send notifications" /> <Switch android:id="@+id/tv_switch_value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|end" android:layout_marginEnd="48dp" tools:checked="true" /> </FrameLayout>
рдлрд┐рд░, рд╣рдо рдЦреБрдж рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╣рдо рдЙрди рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ: рдкрд╣рд▓рд╛ рд╣реИрдбрд░ рдФрд░ рдХреБрдЫ рдореВрд▓реНрдп рдЬреЛ рдмрд╛рд╣рд░ рд╕реЗ рдЖрдпрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдЯрдм рд╣реЛрдЧрд╛, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреВрд╕рд░реА рдмрд╛рд░), рджреВрд╕рд░рд╛ рд╣реИ рд╣реЗрдбрд░ рдФрд░ рдмреВрд▓рд░ рдЪрд░ рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрд╡рд┐рдЪ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЖрдИрдбреА рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдпрджрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╕реНрд╡рдпрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
InfoItem.kt, SwitchItem.kt class InfoItem(val title: String, val value: String): IBaseListItem { override val layoutId = R.layout.item_info } class SwitchItem( val id: Int, val title: String, val actionOnReceive: (itemId: Int, userChoice: Boolean) -> Unit ) : IBaseListItem { override val layoutId = R.layout.item_switch }
рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ ViewHolder рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
InfoViewHolder.kt, SwitchViewHolder.kt class InfoViewHolder.kt(view: View) : RecyclerView.ViewHolder(view) { val tvTitle = view.tv_info_title val tvValue = view.tv_info_value } class SwitchViewHolder.kt(view: View) : RecyclerView.ViewHolder(view) { val tvTitle = view.tv_switch_title val tvValue = view.tv_switch_value }
рдЦреИрд░, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ SimpleListAdapter'a рдХрд╛ рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
SettingsListAdapter.kt class SettingsListAdapter : SimpleListAdapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val context = parent.context return when (viewType) { R.layout.item_info -> InfoHolder(inflateByViewType(context, viewType, parent)) R.layout.item_switch -> SwitchHolder(inflateByViewType(context, viewType, parent)) else -> throw IllegalStateException("There is no match with current layoutId") } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is InfoHolder -> { val infoItem = items[position] as InfoItem holder.tvTitle.text = infoItem.title holder.tvValue.text = infoItem.value } is SwitchHolder -> { val switchItem = items[position] as SwitchItem holder.tvTitle.text = switchItem.title holder.tvValue.setOnCheckedChangeListener { _, isChecked -> switchItem.actionOnReceive.invoke(switchItem.id, isChecked) } } else -> throw IllegalStateException("There is no match with current holder instance") } } }
* рдиреЛрдЯ: рдордд рднреВрд▓рд┐рдП рдХрд┐ рд╣реБрдб рдХреЗ рддрд╣рдд
inflateByViewType рд╡рд┐рдзрд┐
(рд╕рдВрджрд░реНрдн, рджреГрд╢реНрдп, рдореВрд▓): viewType = layoutIdредрд╕рднреА рдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИрдВ! рдЕрдм, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛрдб рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
activity_settings.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rView" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
SettingsActivity.kt class SettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) val adapter = SettingsListAdapter() rView.layoutManager = LinearLayoutManager(this) rView.adapter = adapter adapter.add(InfoItem("User Name", "Leo Allford")) adapter.add(InfoItem("Balance", "350 $")) adapter.add(InfoItem("Tariff", "Business")) adapter.add(SwitchItem(1, "Send Notifications") { itemId, userChoice -> onCheck(itemId, userChoice) }) adapter.add(SwitchItem(2, "Send News on Email") { itemId, userChoice -> onCheck(itemId, userChoice) }) } private fun onCheck(itemId: Int, userChoice: Boolean) { when (itemId) { 1 -> Toast.makeText(this, "Notification now set as $userChoice", Toast.LENGTH_SHORT).show() 2 -> Toast.makeText(this, "Send news now set as $userChoice", Toast.LENGTH_SHORT).show() } } }
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╕рдордп, рд╕рднреА рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрддреЗ рд╣реИрдВ:
1. рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдЖрдЙрдЯ рдХреА
рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛
2. рдЙрдирдХреЗ
рдирд╛рдо рдЪреБрдиреЗрдВред рдореИрдВ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
рдХреБрдЫ Item.kt, item_
something .xml,
рдХреБрдЫ ViewHolder.kt
3. рд╣рдо рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ
рдПрдбрд╛рдкреНрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдбрд╛рдкреНрдЯрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдореИрдВ рдЕрднреА рднреА рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ
onBindViewHolder () рд╡рд┐рдзрд┐ рдЖрдкрдХреЗ рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрдврд╝рддреА рд╣реИ (рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдЧреНрд░рд╕реНрдд рд╣реИ) (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣
SettingsListAdapter ) рд╣реИ + рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдЗрд╕ рд╡рд┐рдзрд┐ рдкрд░ рдЪрд▓рд╛рдПрдБ +
onCreateViewHolder () рд╡рд┐рдзрд┐
4. рдХреЛрдб рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдирдВрдж рд▓реЗрдВ!
рдЬреЗрдЯрдкреИрдХ
рдЙрд╕ рдХреНрд╖рдг рддрдХ, рд╣рдордиреЗ
Item.kt рд╕реЗ рд╣рдорд╛рд░реЗ
item_layout.xml рддрдХ рдорд╛рдирдХ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╣рдо
onBindViewHolder () рд╡рд┐рдзрд┐ рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдиреНрдпреВрдирддрдо рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рддрд░реНрдХ рдХреЛ рдЖрдЗрдЯрдо рдФрд░ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Android JetPack рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдВ:

рдЖрдЗрдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд╣рд▓реЗ рдЯреИрдм рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрдЯрд╛рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд▓реЗрдЦреЛрдВ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдЕрдкрдирд╛
Item.kt -
item.xml (рдпрд╛ рдЖрдк рдЗрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ) рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдЦрди рдХреЗ рд╕рдордп,
рдбреЗрдЯрд╛рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
android { compileSdkVersion 27 defaultConfig {...} buildTypes {...} dataBinding { enabled = true } dependencies { kapt "com.android.databinding:compiler:3.1.3"
рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд┐рдЫрд▓реЗ рдПрдХ рдкреВрд░рдХ рд╣реИ:
interface IBaseItemVm: IBaseListItem { val brVariableId: Int }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ ViewHolder рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмрд╛рдЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП
ViewDataBinding рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓реЗрдЖрдЙрдЯ рдФрд░ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдПрдВрдЧреЗ
class VmViewHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root)
рдпрд╣рд╛рдВ рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ , рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рди рдкрд░ рдпрд╣ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣реИ рдирд╛? =)
VmListAdapter class VmListAdapter : RecyclerView.Adapter<VmViewHolder>(), IBaseListAdapter<IBaseItemVm> { private var mItems = ArrayList<IBaseItemVm>() override fun getItemCount() = mItems.size override fun getItemViewType(position: Int) = mItems[position].layoutId override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VmViewHolder { val inflater = LayoutInflater.from(parent.context) val viewDataBinding = DataBindingUtil.inflate<ViewDataBinding>(inflater!!, viewType, parent, false) return VmViewHolder(viewDataBinding) } override fun onBindViewHolder(holder: VmViewHolder, position: Int) { holder.binding.setVariable(mItems[position].brVariableId, mItems[position]) holder.binding.executePendingBindings() } override fun add(newItem: IBaseItemVm) { mItems.add(newItem) notifyItemInserted(mItems.lastIndex) } override fun add(newItems: ArrayList<IBaseItemVm>?) { val oldSize = mItems.size mItems.addAll(newItems!!) notifyItemRangeInserted(oldSize, newItems.size) } override fun clearAll() { mItems.clear() notifyDataSetChanged() } override fun getItemId(position: Int): Long { val pos = mItems.size - position return super.getItemId(pos) } override fun addAtPosition(pos: Int, newItem: IBaseItemVm) { mItems.add(pos, newItem) notifyItemInserted(pos) } override fun remove(position: Int) { mItems.removeAt(position) notifyItemRemoved(position) } }
рдЖрдо рддреМрд░ рдкрд░
onCreateViewHolder () ,
onBindViewHolder () рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдзреНрдпрд╛рди
рджреЗрдВ ред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдм рдирд╣реАрдВ рдмрдврд╝рддреЗ рд╣реИрдВред рдХреБрд▓, рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рдеред
рд╣рдорд╛рд░реЗ рдЖрдЗрдЯрдо:
InfoItem.kt, SwitchItem.kt class InfoItem(val title: String, val value: String) : IBaseItemVm { override val brVariableId = BR.vmInfo override val layoutId = R.layout.item_info } // class SwitchItem( val id: Int, val title: String, private val actionOnReceive: (itemId: Int, userChoice: Boolean) -> Unit ) : IBaseItemVm { override val brVariableId = BR.vmSwitch override val layoutId = R.layout.item_switch val listener = CompoundButton.OnCheckedChangeListener { _, isChecked -> actionOnReceive.invoke(id, isChecked) } }
рдпрд╣рд╛рдБ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
onBindViewHolder () рд╡рд┐рдзрд┐ рдХрд╛ рддрд░реНрдХ рдХрд╣рд╛рдБ
рдЧрдпрд╛ ред рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрдЯрд╛рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓реЗ рд▓рд┐рдпрд╛ - рдЕрдм рд╣рдорд╛рд░рд╛ рдХреЛрдИ рднреА рд▓реЗрдЖрдЙрдЯ рдЗрд╕рдХреЗ рд╡реНрдпреВ рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рдХреНрд▓рд┐рдХ, рдПрдирд┐рдореЗрд╢рди, рдХреНрд╡реЗрд░реА рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рднреА рддрд░реНрдХ рдХреЛ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред рддреБрдо рдХреНрдпрд╛ рд▓реЗрдХрд░ рдЖрддреЗ рд╣реЛ?
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдбреЗрдкреНрдЯрд░ рдЗрд╕ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рджреЛ-рддрд░рдлрд╝рд╛ рдбреЗрдЯрд╛рдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд░ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рдлреНрд▓реИрд╢ рдХрд░реЗрдЧрд╛, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдПрдбреЙрдкреНрдЯрд░ рдПрдбреЙрдкреНрдЯрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
@BindingAdapter("switchListener") fun setSwitchListener(sw: Switch, listener: CompoundButton.OnCheckedChangeListener) { sw.setOnCheckedChangeListener(listener) }
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рд╡реИрд░рд┐рдПрдмрд▓ рд╡реИрд▓реНрдпреВрдЬ рдХреЛ рдЕрдкрдиреЗ
рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде xml рдХреЗ рдЕрдВрджрд░ рдмрд╛рдВрдзрддреЗ рд╣реИрдВ:
item_info.xml; item_switch.xml <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <data> <import type="com.lfkekpoint.adapters.adapters.presentation.modules.bindableItemsSettings.InfoItem" /> <variable name="vmInfo" type="InfoItem" /> </data> <FrameLayout android:layout_width="match_parent" android:layout_height="56dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="28dp" android:text="@{vmInfo.title}" android:textColor="@color/black" android:textSize="20sp" tools:text="Balance" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|end" android:layout_marginEnd="48dp" android:text="@{vmInfo.value}" tools:text="1000 $" /> </FrameLayout> </layout> <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <import type="com.lfkekpoint.adapters.adapters.presentation.modules.bindableItemsSettings.SwitchItem" /> <variable name="vmSwitch" type="SwitchItem" /> </data> <FrameLayout android:layout_width="match_parent" android:layout_height="56dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginStart="28dp" android:text="@{vmSwitch.title}" android:textColor="@color/black" android:textSize="20sp" tools:text="Send notifications" /> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|end" android:layout_marginEnd="48dp" app:switchListener="@{vmSwitch.listener}" tools:checked="true" /> </FrameLayout> </layout>
app: switchListener = "@ {vmSwitch.listener}" - рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдордиреЗ рдЕрдкрдиреЗ
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдбрд╛рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
* рдиреЛрдЯ: рдЙрдЪрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо xml рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрдЯрд╛рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬрд╛рдирдиреЗ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдпрд╣ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ, рдЬрд▓реНрджреА рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдареАрдХ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Google рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рдЬреЗрдЯрдкреИрдХ рдореЗрдВ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЯреИрдм рдореЗрдВ рдкрд╣рд▓рд╛ рд╣реИред рдПрдХ-рджреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ MVP рдХреЛ MVVM рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ - рдФрд░ рдХрдИ рд╕реБрдЦрдж рд░реВрдк рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ рдареАрдХ рд╣реИ! .. рдЖрд╣, SettingsActivity рдореЗрдВ рдХреЛрдб:
SettingsActivity.kt... рдмрджрд▓ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдПрдбреЗрдкреНрдЯрд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ! =) рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдкрд░ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ:
class SettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) val adapter = BaseVmListAdapter() rView.layoutManager = LinearLayoutManager(this) rView.adapter = adapter adapter.add(InfoItem("User Name", "Leo Allford")) adapter.add(InfoItem("Balance", "350 $")) adapter.add(InfoItem("Tariff", "Business")) adapter.add(SwitchItem(1, "Send Notifications") { itemId, userChoice -> onCheck(itemId, userChoice) }) adapter.add(SwitchItem(2, "Send News on Email") { itemId, userChoice -> onCheck(itemId, userChoice) }) } private fun onCheck(itemId: Int, userChoice: Boolean) { when (itemId) { 1 -> Toast.makeText(this, "Notification now set as $userChoice", Toast.LENGTH_SHORT).show() 2 -> Toast.makeText(this, "Send news now set as $userChoice", Toast.LENGTH_SHORT).show() } } }
рдкрд░рд┐рдгрд╛рдо
рд╣рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдорд┐рд▓рд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдореИрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛
рдбреЗрдЯрд╛рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рд╕рднреА рддреИрдпрд╛рд░реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреА рд╣реИ, .xml рдореЗрдВ рдЖрдЗрдЯрдореЛрдВ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдФрд░ рдлрд┐рд░ .kt рдореЗрдВ рдЪрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧред
рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рджреЗрдирд╛рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдЕрдкрд╛рдЪреЗ рд╕реЗ
рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ - рдФрд░
рдореЗрд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдПрдХ рдЫреЛрдЯреЗ
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдХрд╛рдо рдЖрдПрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдпрд╣ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЧреНрд░реИрдбрд▓ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдЖрдкрд╕реЗ рдЭреВрда рдмреЛрд▓ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди
PackageName рдХреЛ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ
рдореВрд░реНрдЦ рдирд╣реАрдВ
рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рднрд╛рд╖рд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИ
рд╕рдВрджрд░реНрдн / рдореАрдбрд┐рдпрд╛
1.
рдЖрдзреБрдирд┐рдХ рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд┐рдХрд╛рд╕: рдПрдВрдбреНрд░реЙрдЗрдб рдЬреЗрдЯрдкреИрдХ, рдХреЛрдЯрд▓рд┐рди, рдФрд░ рдЕрдзрд┐рдХ (Google I / O 2018, 40 рдореАрдЯрд░ред) - рдЖрдЬ рдлреИрд╢рди рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЧрд╛рдЗрдб, рдпрд╣рд╛рдВ рд╕реЗ рдпрд╣ рднреА рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ RecyclerView рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ;
2.
Droidcon NYC 2016 - рд░реЗрдбрд┐рдХрд▓ рд░рд┐рд╕рд╛рдЗрдХреНрд▓рд░рд╡реНрдпреВ, 36 рдореАрдЯрд░ред -
рд▓реАрд╕рд╛ рд░реЗ рд╕реЗ RecyclerView рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ;
3.
RecyclerView рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдВ - рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ
4.
рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдо рдХрдХреНрд╖рд╛рдПрдВ5.
рдПрдВрдбреНрд░реЙрдЗрдб рдЖрдИрдбреАрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рд╛рд░реВрдк ,
рдХреБрд▓ рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ ,
рдлреНрд░реАрдорд╛рд░реНрдХрд░ рдореИрдиреБрдЕрд▓ - рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
6.
рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХреЛрдб (рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╣реИрдВ, рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ),
рдХрд╛рдо рдФрд░
рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ ,
рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ7. рд▓реЗрдЦ рдХрд╛
рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг