Dans mon article précédent, j'ai parlé de la première tentative d'écriture d'une bibliothèque pour une sélection simple et pratique des éléments d'une liste dans Android, en tenant compte de l'approche MVVM. La dernière fois, la solution n'était pas liée à la plate-forme, je n'ai donc pas atteint l'objectif final.
Quelques mois plus tard, quand j'ai suffisamment réfléchi, tergiversé et travaillé, j'ai déjà obtenu une solution plus adaptée à Android, car elle est basée sur LiveData
. Je demande à toutes les personnes intéressées de lire.
Modifications effectuées
Avant de parler de la nouvelle bibliothèque, pour commencer, dès que possible, je décrirai brièvement les changements dans ce dont j'ai parlé dans l'article précédent.
Héritage d'intercepteur
La première chose qui m'a semblé étrange dans ma propre solution était une interface commune, qui nous oblige à implémenter la logique des intercepteurs - une méthode addSelectionInterceptor
- donc je n'ai essentiellement pas laissé mon implémentation standard de cette méthode héritée pour de nouvelles classes. Par conséquent, j'ai mis la méthode spécifiée dans une interface distincte - InterceptableSelectionManager
qui hérite de l'interface commune. En conséquence, les utilisateurs peuvent choisir une option dans laquelle ils ne sont pas obligés de travailler avec des intercepteurs, car cette fonctionnalité, il me semble, n'est toujours pas très demandée.
Eh bien, en parlant de l'héritage de la logique que j'ai écrite, une classe abstraite de base BaseInterceptableSelectionManager
est créée dans laquelle seuls les intercepteurs sont décrits. Comme - utiliser sur la santé. Dans tous les cas, vous pouvez toujours utiliser l'interface et tout implémenter à votre façon.
Dénomination plus précise
Oui, j'ai changé le nom de la méthode d'interface dans le projet, que j'ai déclaré prêt et partagé. Oui, je comprends que brûler en enfer pour de telles ébats. Pour ma défense, je peux seulement dire que le nom ne décrivait pas précisément l'action qui s'y déroulait. Il s'agit de la méthode, qui était appelée dans la version précédente selectPosition
, et maintenant 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
', . , , . , - .
:
Liens à Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'