рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрд╕рд░реЗ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЪрдпрдирд┐рдд рддрддреНрд╡ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдЪрд╛рд░ рдереЗ рдХрд┐ рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реЛред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЧрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреЛ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрджрд▓рдиреА рдкрдбрд╝реЗред
рдПрдорд╡реАрд╡реАрдПрдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреВрдмрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрд░реНрдпреБрдХреНрдд рдкреНрд░рд╢реНрди рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрднрд░рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдбреЙрдкреНрдЯрд░ рд╕реНрд╡рдпрдВ View
рд╕реНрддрд░ рдкрд░ рд╣реИ, рдЬрдмрдХрд┐ рдЪрдпрдирд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрдХреНрд╕рд░ ViewModel
рд▓рд┐рдП рдЕрддреНрдпрдВрдд рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЬрд╡рд╛рдм рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рдмрд┐рддрд╛рдпрд╛, рд▓реЗрдХрд┐рди, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореИрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рд░рд┐рдорд╛рд░реНрдХ ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ Android рдкрд░ MVVM рдХреЗ рд▓рд┐рдП рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛, LiveData
рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЬрд╛ LiveData
, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реВрдБред рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рд╣реИред рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди Android
рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд┐рдХрд▓рд╛, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдЯрд▓рд┐рди рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
SelectionManager
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп SelectionManager
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
interface SelectionManager { fun clearSelection() fun selectPosition(position: Int) fun isPositionSelected(position: Int): Boolean fun registerSelectionChangeListener(listener: (position: Int, isSelected: Boolean) -> Unit): Disposable fun getSelectedPositions(): ArrayList<Int> fun isAnySelected(): Boolean fun addSelectionInterceptor(interceptor: (position: Int, isSelected: Boolean, callback: () -> Unit) -> Unit): Disposable }
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 3 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ:
MultipleSelection
- рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЛ рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;SingleSelection
- рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;NoneSelection
рднреА рдирд╣реАрдВ - рд╡рд╕реНрддреБ рдмрд┐рд▓реНрдХреБрд▓ рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИред
рд╕рдВрднрд╡рддрдГ, рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рд╕рднреА рдкреНрд░рд╢реНрди рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рдЕрдиреБрдХреВрд▓рдХ
рдпрд╣ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП SelectionManager
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
class TestAdapter(private val selectionManager: SelectionManager) : RecyclerView.Adapter<TestHolder>() {
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдХрд┐рд╕реА рддрддреНрд╡ рдкрд░ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реНрдХ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрдКрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╕ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдзрд╛рд░рдХ (рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд┐рдирд╛) рдХреНрд▓рд┐рдХ рд╢реНрд░реЛрддрд╛ рдХреА рдирд┐рдпреБрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
class TestHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: Any, onItemClick: () -> Unit) {
рдЖрдЧреЗ, рдЗрд╕ рдЬрд╛рджреВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 3 рдЪрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
1. onBindViewHolder
рдзрд╛рд░рдХ рдХреА bind
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рддрддреНрд╡ рдХреЗ рд▓рд┐рдП selectionManager.selectPosition(position)
рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рднреА, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХреЗрд╡рд▓ рдкреГрд╖реНрдарднреВрдорд┐) рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ - рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП selectionManager.isPositionSelected(position)
рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
override fun onBindViewHolder(holder: TestHolder, position: Int) { val isItemSelected = selectionManager.isPositionSelected(position)
2. registerSelectionChangeListener
рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рджрдмрд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдордп рдкрд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдЪрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
private val selectionDisposable = selectionManager.registerSelectionChangeListener { position, isSelected -> notifyItemChanged(position) }
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ isSelected
рдкреИрд░рд╛рдореАрдЯрд░ isSelected
рдорд╛рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдореВрд▓реНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
3. selectionDisposable
рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рд▓реАрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рддреА рд╣реИред рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рд╡рд╕реНрддреБ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
fun destroy() { selectionDisposable.dispose() }
ViewModel
рдЬрд╛рджреВ рдХреЗ рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд╣рдо ViewModel
рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред SelectionManager
рд╢реБрд░реБрдЖрдд рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ:
class TestViewModel: ViewModel() { val selectionManager: SelectionManager = SingleSelection() }
рдпрд╣рд╛рдВ, рдПрдбреЙрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рдЖрдк рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдбрд┐рд▓реАрдЯ" рдмрдЯрди рдХреЛ рджреБрд░реНрдЧрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдХреЛрдИ рдЖрдЗрдЯрдо рдирд╣реАрдВ рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЖрдк рд╕рднреА рдЪрдпрдирд┐рддреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдмрдЯрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЪрдпрдирд┐рдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ") рдкрд░ рднреА рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ред
fun onDownloadClick() { val selectedPositions: ArrayList<Int> = selectionManager.getSelectedPositions() ... }
рдФрд░ рдпрд╣рд╛рдБ рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рдордВрддреНрд░ рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ: рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдкрд░, рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рддрддреНрд╡реЛрдВ рдХреЗ рдкрджреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдпрд╣реА рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ рдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЙрдирдХреЗ рдкрджреЛрдВ рдкрд░ рдирд╣реАрдВ, рдПрдбреЗрдкреНрдЯрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЕрдлрд╕реЛрд╕, рдЕрдм рддрдХ рдХреЗрд╡рд▓)ред рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рд╡реНрдпреВ рдореЙрдбрд▓ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реНрддрд░ рдкрд░ рд╣реИред
class TestActivity: AppCompatActivity() { private lateinit var adapter: TestAdapter private lateinit var viewModel: TestViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
рд▓рдЪреАрд▓рд╛рдкрди
рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рд╕рдордЭ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рдЪрдпрди рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдПрдбреЙрдкреНрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ TestViewModel
рдореЗрдВ selectionManager
TestViewModel
рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ TestViewModel
, рддреЛ рдмрд╛рдХреА рдХреЛрдб рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ "рдирдП рддрд░реАрдХреЗ рд╕реЗ" рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдпрд╣реА рд╣реИ, val selectionManager: SelectionManager = MultipleSelection()
рд╕реЗрдЯ рдХрд░реЗрдВ val selectionManager: SelectionManager = MultipleSelection()
, рдФрд░ рдЕрдм рдПрдбреЗрдкреНрдЯрд░ рдЖрдкрдХреЛ рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдзрд╛рд░ рдПрдбрд╛рдкреНрдЯрд░ рд╡рд░реНрдЧ рд╣реИ, рддреЛ рдЖрдк SelectionManager
рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ рдбрд░ рдирд╣реАрдВ рд╕рдХрддреЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ NoneSelection
рд▓рд┐рдП рдЬреЛ рддрддреНрд╡реЛрдВ рдХреА рдкрд╕рдВрдж рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорддрд▓рдм рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, NoneSelection
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ - рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдЪрдпрдирд┐рдд рддрддреНрд╡ рдХрднреА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдХрд┐рд╕реА рднреА рд╢реНрд░реЛрддрд╛ рдХреЛ рдХрднреА рдирд╣реАрдВ NoneSelection
ред рдирд╣реАрдВ, рд╡рд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ - рд╡рд╣ рдмрд╕ рд╕рднреА рдХреЙрд▓реЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдбреЙрдкреНрдЯрд░ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░
рдРрд╕реЗ рдорд╛рдорд▓реЗ рднреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреА рдкрд╕рдВрдж рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рд▓реЛрдб рдХрд░рдирд╛) рдХреЗ рд╕рд╛рде рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╕рдлрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЧрд▓рдд рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреАред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЕрд╡рд░реЛрдзрди рддрдВрддреНрд░ рдЬреЛрдбрд╝рд╛ред
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдРрдб addSelectionInterceptor
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рдЖрдкрдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред callback: () -> Unit
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ callback: () -> Unit
- рдЬрдм рддрдХ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрд░реНрдерд╛рддреН, рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╕реЗ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрджрдиреБрд╕рд╛рд░, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП selectionManager
рдкреНрд░рдмрдВрдзрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреАред рдпрджрд┐ рдпрд╣ рдареАрдХ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
val interceptionDisposable = selectionManager.addSelectionInterceptor { position: Int, isSelected: Boolean, callback: () -> Unit -> if(isSelected) { val selectedItem = ...
рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд╣рд▓реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ callback()
рдХреЙрд▓ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ callback()
рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ selectionManager
рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ
Disposable
рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Disposable
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рд▓реЗрдХрд┐рди LiveData
рдЬрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд▓рд╛рдЗрди рдкрд░ рдкрд╣рд▓рд╛ рд╕реБрдзрд╛рд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП android.arch.lifecycle
рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред- рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдореИрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдпрд╣ рдПрдбреЙрдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрджрд░реНрдн
рдЖрдк рд▓рд┐рдВрдХ рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ - GitHub
рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ ru.ircover.selectionmanager:core:1.0.0
- ru.ircover.selectionmanager:core:1.0.0
рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ