MVVM和适配器中的元素选择-LiveData

上一篇文章中,我谈到了首次尝试编写库,以考虑到MVVM方法从Android列表中轻松方便地选择项目。上次,该解决方案与平台无关,因此我没有达到最终目标。


几个月后,当我足够思考,拖延并努力工作时,我已经有了一个基于的更适合Android的解决方案LiveData我请每个有兴趣的人阅读。


所做的更改


在讨论新库之前,我将首先简要地描述上一篇文章中的更改。


拦截器继承


在我自己的解决方案中,对我来说第一件似乎很奇怪的事情是一个通用接口,该接口迫使我们实现拦截器的逻辑-一种方法addSelectionInterceptor-因此,我基本上不让该方法的标准实现继承新类。因此,我将指定的方法放在一个单独的接口中- InterceptableSelectionManager继承了公共接口。结果,用户可以选择不强迫他们使用拦截器的选项,因为在我看来,这种功能仍然不是很常见。


好了,说到我编写的逻辑的继承,BaseInterceptableSelectionManager就制作了一个基本的抽象类,其中仅描述了拦截器。喜欢-用于健康。无论如何,您始终可以使用该界面并以自己的方式从头开始实现所有功能。


更精确的命名


是的,我更改了项目中接口方法的名称,并声明其已准备好并共享。是的,我知道这种滑稽动作会在地狱中燃烧。为了辩护,我只能说这个名字实际上并不能准确地描述其中发生的行为。它与方法有关,在以前的版本中称为selectPosition,现在称为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', . , , . , - .


:



Gradle中的链接:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles