MVVM واختيار العناصر في المحول - LiveData

في مقالتي السابقة ، تحدثت عن المحاولة الأولى لكتابة مكتبة لاختيار بسيط ومريح للعناصر من قائمة في 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

:


  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