एडॉप्टर में MVVM और तत्वों का चयन - LiveData

अपने पिछले लेख में, मैंने एमवीवीएम दृष्टिकोण को ध्यान में रखते हुए एंड्रॉइड में एक सूची से वस्तुओं के सरल और सुविधाजनक चयन के लिए एक पुस्तकालय लिखने के पहले प्रयास के बारे में बात की थी। पिछली बार, समाधान मंच से बंधा नहीं था, इसलिए मैं अंतिम लक्ष्य तक नहीं पहुंचा था।


कुछ महीनों बाद, जब मैंने पर्याप्त सोचा, शिथिल और काम किया, तो मुझे पहले से ही एक समाधान मिला जो एंड्रॉइड के लिए अधिक उपयुक्त है, क्योंकि यह आधारित है 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', . , , . , - .


:



स्नातक में लिंक:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles