MVVM und Auswahl der Elemente im Adapter - LiveData

In meinem vorherigen Artikel habe ich über den ersten Versuch gesprochen, eine Bibliothek für die einfache und bequeme Auswahl von Elementen aus einer Liste in Android zu schreiben, wobei der MVVM-Ansatz berücksichtigt wurde. Beim letzten Mal war die Lösung nicht an die Plattform gebunden, sodass ich das endgültige Ziel nicht erreichte.


Ein paar Monate später, als ich genug nachdachte, zögerte und arbeitete, bekam ich bereits eine Lösung, die besser für Android geeignet ist, da sie darauf basiert LiveData. Ich bitte alle Interessierten zu lesen.


Änderungen vorgenommen


Bevor ich über die neue Bibliothek spreche, werde ich zunächst so bald wie möglich kurz die Änderungen beschreiben, über die ich im vorherigen Artikel gesprochen habe.


Interceptor-Vererbung


Das erste, was mir in meiner eigenen Lösung seltsam erschien, war eine gemeinsame Schnittstelle, die uns verpflichtet, die Logik der Interzeptoren - eine Methode addSelectionInterceptor- zu implementieren. Daher ließ ich meine Standardimplementierung dieser Methode im Wesentlichen nicht für neue Klassen vererben. Daher habe ich die angegebene Methode in eine separate Schnittstelle InterceptableSelectionManagereingefügt, die die gemeinsame Schnittstelle erbt. Infolgedessen können Benutzer eine Option auswählen, bei der sie nicht gezwungen sind, mit Abfangjägern zu arbeiten, da diese Funktionalität, wie es mir scheint, immer noch nicht sehr häufig gefragt ist.


Nun, wenn wir von der Vererbung der Logik sprechen, die ich geschrieben habe, wird eine grundlegende abstrakte Klasse BaseInterceptableSelectionManagergebildet, in der nur Abfangjäger beschrieben werden. Like - für die Gesundheit verwenden. In jedem Fall können Sie die Benutzeroberfläche jederzeit verwenden und alles von Grund auf neu implementieren.


Genauere Benennung


Ja, ich habe den Namen der Schnittstellenmethode im Projekt geändert, die ich als bereit und freigegeben deklariert habe. Ja, ich verstehe das Brennen in der Hölle für solche Possen. Zu meiner Verteidigung kann ich nur sagen, dass der Name die darin stattfindende Aktion tatsächlich nicht genau beschrieben hat. Es geht um die Methode, die in der vorherigen Version aufgerufen wurde selectPosition, und jetzt geht es darum 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 in Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles