No meu artigo anterior, falei sobre a primeira tentativa de escrever uma biblioteca para uma seleção simples e conveniente de itens de uma lista no Android, levando em consideração a abordagem MVVM. Na última vez, a solução não estava atrelada à plataforma, então não alcancei o objetivo final.
Alguns meses depois, quando pensei o suficiente, procrastinei e trabalhei, já consegui uma solução mais adequada especificamente para o Android, pois ela é baseada LiveData
. Peço a todos os interessados que leiam.
Alterações efetuadas
Antes de falar sobre a nova biblioteca, para começar, o mais rápido possível, descreverei brevemente as mudanças no que falei no artigo anterior.
Herança do interceptador
A primeira coisa que me pareceu estranha em minha própria solução foi uma interface comum, que nos obriga a implementar a lógica dos interceptores - um método addSelectionInterceptor
-, de modo que eu essencialmente não deixei minha implementação padrão desse método ser herdada para novas classes. Portanto, coloquei o método especificado em uma interface separada - InterceptableSelectionManager
que herda a interface comum. Como resultado, os usuários podem escolher a opção em que não são forçados a trabalhar com interceptores, pois essa funcionalidade, como me parece, ainda não é muito procurada.
Bem, falando da herança da lógica que escrevi, BaseInterceptableSelectionManager
é feita uma classe abstrata básica na qual apenas os interceptores são descritos. Como - use na saúde. De qualquer forma, você sempre pode usar a interface e implementar tudo do zero à sua maneira.
Nomenclatura mais precisa
Sim, mudei o nome do método de interface no projeto, que declarei pronto e compartilhado. Sim, eu entendo isso queimando no inferno por essas palhaçadas. Em minha defesa, posso apenas dizer que o nome realmente não descreveu com precisão a ação que estava ocorrendo nele. É sobre o método, que na versão anterior foi chamado selectPosition
, e agora clickPosition
.
, , , . , . , ( , ).
, deselectPosition
, , . .
. , , .
, , , - . , — SelectableDataSource
.
class SelectableDataSource<T>(private var dataSource: ArrayList<T>,
private val selectionManager: SelectionManager)
: SelectionManager by selectionManager
:
SelectionManager
, . , . .
SelectionManager
, , .
ArrayList
, . ( ), , — ArrayList
.
constructor(selectionManager: SelectionManager) : this(arrayListOf(), selectionManager)
setDataSource
.
fun setDataSource(dataSource: ArrayList<T>, changeMode: ChangeDataSourceMode)
, . :
ChangeDataSourceMode.ClearAllSelection
— , . , , ;ChangeDataSourceMode.HoldSelectedPositions
— . , 2 , 2 . , , 3 ;ChangeDataSourceMode.HoldSelectedItems
— ( ). , . , , Equals
.
, ArrayIndexOutOfBoundsException
. clickPosition
, setDataSource
, . , , SelectionManager
', , — .
val selectionManager: SelectionManager
val dataSource = SelectableDataSource<User>(selectionManager)
selectionManager.registerSelectionChangeListener { position: Int, isSelected: Boolean -> ...}
dataSource.registerSelectionChangeListener { position: Int, isSelected: Boolean -> ...}
, SelectionManager
', . , InterceptableSelectableDataSource
. , , , .
class InterceptableSelectableDataSource<T>(dataSource: ArrayList<T>,
private val selectionManager: InterceptableSelectionManager)
: SelectableDataSource<T>(dataSource, selectionManager),
InterceptableSelectionManager
LiveDataSource
— . - , LiveData
. InterceptableSelectionManager
, .
val users = LiveDataSource<User>(MultipleSelection())
setDataSource
, SelectableDataSource
.
val newValues: ArrayList<User>
users.setDataSource(newValues)
users.setDataSource(newValues, ChangeDataSourceMode.HoldSelectedItems)
. allItems
, LiveData
.
viewModel.users.allItems.observe(this, Observer { items: ArrayList<User> -> ... })
selectedItems
.
viewModel.users.selectedItems.observe(this, Observer { selectedItems: ArrayList<User> -> ... })
, , , observeSelectionChange
observeItemSelectionChange
. , , — .
viewModel.users.observeSelectionChange(this) { position: Int, isSelected: Boolean -> ... }
viewModel.users.observeItemSelectionChange(this) { user: User, isSelected: Boolean -> ... }
, , .
- ,
RecyclerView.Adapter
, LiveData
. , - , . - . , .
LiveDataSource
SelectionManager
', . , , . , - .
:
Links para dentro Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'