MVVM et sélection d'éléments dans l'adaptateur - LiveData

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 - InterceptableSelectionManagerqui 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 BaseInterceptableSelectionManagerest 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

:


  1. SelectionManager, . , . .


  2. SelectionManager, , .


  3. ArrayList, . ( ), , — ArrayList.


    constructor(selectionManager: SelectionManager) : this(arrayListOf(), selectionManager)

  4. setDataSource.


    fun setDataSource(dataSource: ArrayList<T>, changeMode: ChangeDataSourceMode)

    , . :


    • ChangeDataSourceMode.ClearAllSelection — , . , , ;
    • ChangeDataSourceMode.HoldSelectedPositions — . , 2 , 2 . , , 3 ;
    • ChangeDataSourceMode.HoldSelectedItems — ( ). , . , , Equals.

  5. , ArrayIndexOutOfBoundsException. clickPosition , setDataSource , . , , SelectionManager', , — .


    val selectionManager: SelectionManager
    val dataSource = SelectableDataSource<User>(selectionManager)
    selectionManager.registerSelectionChangeListener { position: Int, isSelected: Boolean -> ...} //
    dataSource.registerSelectionChangeListener { position: Int, isSelected: Boolean -> ...} //

  6. , 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> -> ... })
//this -    Activity    LifecycleOwner

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 -> ... }


, , .


  1. , RecyclerView.Adapter, LiveData . , - , .
  2. . , .
  3. LiveDataSource SelectionManager', . , , . , - .


:



Liens à Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles