MVVM y selección de elementos en el adaptador - LiveData

En mi artículo anterior, hablé sobre el primer intento de escribir una biblioteca para una selección simple y conveniente de elementos de una lista en Android, teniendo en cuenta el enfoque MVVM. La última vez, la solución no estaba vinculada a la plataforma, por lo que no alcancé el objetivo final.


Unos meses más tarde, cuando pensé lo suficiente, postergué y trabajé, ya obtuve una solución que es más adecuada para Android, en la que se basa LiveData. Pido a todos los interesados ​​que lean.


Cambios realizados


Antes de hablar sobre la nueva biblioteca, para comenzar, lo antes posible, describiré brevemente los cambios en lo que hablé en el artículo anterior.


Herencia del interceptor


Lo primero que me pareció extraño en mi propia solución fue una interfaz común, que nos obliga a implementar la lógica de los interceptores, un método addSelectionInterceptor, por lo que esencialmente no permití que mi implementación estándar de este método se heredara para nuevas clases. Por lo tanto, pongo el método especificado en una interfaz separada, InterceptableSelectionManagerque hereda la interfaz común. Como resultado, los usuarios pueden elegir una opción en la que no están obligados a trabajar con interceptores, ya que esta funcionalidad, como me parece, todavía no es muy solicitada.


Bueno, hablando de la herencia de la lógica que escribí, se hace una clase abstracta básica BaseInterceptableSelectionManageren la que solo se describen los interceptores. Me gusta: uso en la salud. En cualquier caso, siempre puede usar la interfaz e implementar todo desde cero a su manera.


Nombramiento más preciso


Sí, cambié el nombre del método de interfaz en el proyecto, que declaró listo y compartido. Sí, entiendo que arder en el infierno por tales payasadas. En mi defensa, solo puedo decir que el nombre en realidad no describe con precisión la acción que tiene lugar en él. Se trata del método, que en la versión anterior se llamaba selectPosition, y ahora lo es 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', . , , . , - .


:



Enlaces en Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles