Android рд╡рд┐рдХрд╛рд╕ред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХреБрдЫ Android рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реЗ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рдЕрднреА рддрдХ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд╕рдХрддреА рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХрд╣рд╛рдиреА рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреИрд╕реЗ рдЖрдпрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ:

  • рд╣рдо RecyclerView рдФрд░ RecyclerView.Adcape рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ
  • рдПрдВрдбреНрд░реЙрдЗрдб рдЬреЗрдЯрдкреИрдХ рд╕реЗ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (рд╡реИрдХрд▓реНрдкрд┐рдХ, рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдмрд┐рдирд╛)
  • рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП - рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдХрд▓реНрдк;)

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рддреЛ рдареАрдХ рд╣реИ! рд╕рднреА рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ListView рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдП рд╣реИрдВ рдФрд░ RecyclerView ( Rv ) рдкрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рдЙрди рд╕рдордпреЛрдВ рдореЗрдВ рдЬрдм рд╣рдордиреЗ ViewHolder рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ рдЦреБрдж рд╡рд┐рд╕реНрдорд░рдг рдореЗрдВ рдбреВрдм рдЧрдП рд╣реИрдВред рдЖрд░рд╡реА рд╣рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LayoutManagers рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЪрдпрдиред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рд╕реНрдХреНрд░реАрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдареАрдХ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡реНрдпреВрдмреЛрд░реНрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рд╣рдореЗрдВ Google I / O рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХреА рдХрд╣рд╛рдиреА рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди, рд╣рдореЗрд╢рд╛ "рдмрдЯреНрд╕!" рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реЛрддреА рд╣реИ .. рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рдорд╛рдирдХ рдЙрддреНрддрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдХреЙрдкреА рдкреЗрд╕реНрдЯ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЬрд╣рд╛рдВ рдПрдбреЙрдкреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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

рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЖрдкрдХреА рдмрд╛рдЗрдХ рдХреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рд╕реЗ рдЖрдзрд╛рд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИ, рдирдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ред рдЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рддрд░реНрдХ рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛ рддреНрдпрд╛рдЧрдХрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рдФрд░ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИ - рдЖрдкрдХреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдлреИрд╕рд▓реЗ рд╕реЗ рдмрдВрдзреЗ рдмрд┐рдирд╛ рдЬрд░реВрд░рдд рд╣реИред

рдЖрдЗрдП рд╢реБрд░реВ рд╕реЗ рд╣реА рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рд╕рд╣реА рд╕реЛрдЪреЗрдВ


рдШрдЯрдХ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП , рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рди рдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ , рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрд░реНрдХ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдмрдирддрд╛ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж - рдПрдХ рд╡рд░реНрдЧ рдЬреЛ рдЕрдореВрд░реНрдд рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдореИрдВ рдмреБрдирд┐рдпрд╛рджреА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЙрд╕реА рджрд┐рд╢рд╛ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ - рдпреЛрдЬрдирд╛ рдпрд╣ рд╣реИ: рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ -> рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдЬреЛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд▓реЗрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) -> рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ ред рдЖрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдЖрдк RecyclerView.Adcape рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рдорд┐рд▓реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рддрд░реАрдХреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

IBaseListAdapter
interface 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. рд▓реЗрдЦ рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг

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


All Articles