MVVM e seleção de elementos no adaptador - LiveData

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

:


  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', . , , . , - .


:



Links para dentro Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles