在上一篇文章中,我谈到了首次尝试编写库,以考虑到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
:
SelectionManager
, . , . .
SelectionManager
, , .
ArrayList
, . ( ), , — ArrayList
.
constructor(selectionManager: SelectionManager) : this(arrayListOf(), selectionManager)
setDataSource
.
fun setDataSource(dataSource: ArrayList<T>, changeMode: ChangeDataSourceMode)
, . :
ChangeDataSourceMode.ClearAllSelection
— , . , , ;ChangeDataSourceMode.HoldSelectedPositions
— . , 2 , 2 . , , 3 ;ChangeDataSourceMode.HoldSelectedItems
— ( ). , . , , Equals
.
, ArrayIndexOutOfBoundsException
. clickPosition
, setDataSource
, . , , SelectionManager
', , — .
val selectionManager: SelectionManager
val dataSource = SelectableDataSource<User>(selectionManager)
selectionManager.registerSelectionChangeListener { position: Int, isSelected: Boolean -> ...}
dataSource.registerSelectionChangeListener { position: Int, isSelected: Boolean -> ...}
, 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> -> ... })
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 -> ... }
, , .
- ,
RecyclerView.Adapter
, LiveData
. , - , . - . , .
LiveDataSource
SelectionManager
', . , , . , - .
:
Gradle中的链接:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'