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 - InterceptableSelectionManagerque 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'