MVVM dan pemilihan elemen dalam adaptor - LiveData

Dalam artikel saya sebelumnya, saya berbicara tentang upaya pertama untuk menulis perpustakaan untuk pemilihan item yang sederhana dan nyaman dari daftar di Android, dengan mempertimbangkan pendekatan MVVM. Terakhir kali, solusinya tidak terikat pada platform, jadi saya tidak mencapai tujuan akhir.


Beberapa bulan kemudian, ketika saya berpikir cukup, menunda-nunda dan bekerja, saya sudah mendapatkan solusi yang lebih cocok untuk Android, karena didasarkan pada LiveData. Saya meminta semua orang tertarik untuk membaca.


Perubahan dilakukan


Sebelum berbicara tentang perpustakaan baru, untuk memulai, sesegera mungkin, saya akan menjelaskan secara singkat perubahan dalam apa yang saya bicarakan di artikel sebelumnya.


Warisan Interceptor


Hal pertama yang tampak aneh bagi saya dalam solusi saya sendiri adalah antarmuka umum yang mengharuskan kami untuk menerapkan logika pencegat - metode addSelectionInterceptor- jadi saya pada dasarnya tidak membiarkan implementasi standar saya dari metode ini diwarisi untuk kelas baru. Oleh karena itu, saya menempatkan metode yang ditentukan ke dalam antarmuka terpisah - InterceptableSelectionManageryang mewarisi antarmuka umum. Akibatnya, pengguna dapat memilih opsi di mana mereka tidak dipaksa untuk bekerja dengan pencegat, karena fungsi ini, seperti yang menurut saya, masih sangat jarang diminati.


Nah, berbicara tentang pewarisan logika yang saya tulis, kelas abstrak dasar BaseInterceptableSelectionManagerdibuat di mana hanya pencegat dijelaskan. Suka - gunakan pada kesehatan. Bagaimanapun, Anda selalu dapat menggunakan antarmuka dan mengimplementasikan semuanya dari awal dengan cara Anda sendiri.


Penamaan yang lebih tepat


Ya, saya mengubah nama metode antarmuka dalam proyek, yang saya nyatakan siap dan bagikan. Ya, saya mengerti bahwa membakar neraka untuk kejenakaan seperti itu. Dalam pembelaan saya, saya hanya bisa mengatakan bahwa nama itu sebenarnya tidak secara akurat menggambarkan tindakan yang terjadi di dalamnya. Ini tentang metode, yang dalam versi sebelumnya dipanggil selectPosition, dan sekarang 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', . , , . , - .


:



Tautan dalam Gradle:
implementation 'ru.ircover.selectionmanager:core:1.1.0'
implementation 'ru.ircover.selectionmanager:livesource:1.0.0'


All Articles