في مقالتي السابقة ، تحدثت عن المحاولة الأولى لكتابة مكتبة لاختيار بسيط ومريح للعناصر من قائمة في Android ، مع مراعاة نهج MVVM. في المرة الماضية ، لم يكن الحل مرتبطًا بالمنصة ، لذلك لم أصل إلى الهدف النهائي.
بعد بضعة أشهر ، عندما فكرت بما فيه الكفاية ، وتماطلت وعملت ، حصلت بالفعل على حل أكثر ملاءمة لنظام 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
', . , , . , - .
:
- SelectionManager - جيثب
- LiveSource - جيثب
الروابط في Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'