MVVM dan Memilih Item dalam Adaptor - Adaptor Dasar

Jadi, saya akhirnya mencapai puncak dari ide saya dengan pustaka yang menyertakan logika untuk memilih item dari daftar di adaptor. Setelah solusi independen platform dan pustaka berdasarkan LiveData , saya menulis sesuatu untuk membantu Anda dengan cepat dan mudah menghubungkan semua ini ke adaptor untuk mengurangi keseluruhan kode.



SelectingListAdapter



Mari kita mulai dengan antarmuka SelectingListAdapter sederhana yang saya tambahkan untuk adaptor dengan daftar linier biasa. Menurut pengalaman saya, antara 90-95% adaptor dijual dalam bentuk ini.



interface SelectingListAdapter<T> {
    fun setListItems(items: ArrayList<T>)
}


Tidak ada yang rumit - hanya memperbarui daftar item. Dan, menurut saya, tidak akan sulit menambahkan antarmuka ini ke daftar yang diterapkan di adaptor Anda. Untuk apa? Untuk dapat menggunakan kedua metode ekstensi, yang akan saya sebutkan selanjutnya:



fun <T> SelectingListAdapter<T>.observeItemsChange(lifecycleOwner: LifecycleOwner,
                                                   liveDataSource: LiveDataSource<T>) {
    liveDataSource.allItems.observe(lifecycleOwner, { items -> setListItems(items) })
}


Metode observeItemsChangeberlangganan perubahan daftar item di LiveDataSource.



fun RecyclerView.Adapter<*>.observeSelectionChange(lifecycleOwner: LifecycleOwner,
                                                   liveDataSource: LiveDataSource<*>) {
    liveDataSource.observeSelectionChange(lifecycleOwner) { position, _ ->
        notifyItemChanged(position)
    }
}


Metode ini observeSelectionChangetelah mengikuti perubahan dalam pemilihan item. Disini hanya ada notifikasi bahwa elemen perlu diupdate. Memeriksa apakah item ini sudah dipilih akan dijelaskan di bawah ini.



fun <T, TAdapter> TAdapter.observeAllChanges(lifecycleOwner: LifecycleOwner,
                                             liveDataSource: LiveDataSource<T>)
        where TAdapter : RecyclerView.Adapter<*>,
              TAdapter : SelectingListAdapter<T> {
    observeSelectionChange(lifecycleOwner, liveDataSource)
    observeItemsChange(lifecycleOwner, liveDataSource)
}


Nah, jika Anda ingin memanggil kedua metode sekaligus, ada observeAllChangessatu yang akan melakukannya dalam satu baris.



BaseSelectingListAdapter Class



, LiveDataSource, . , :



abstract class BaseSelectingListAdapter<T, VH: BaseSelectingListHolder<T>> 
        : RecyclerView.Adapter<VH>(), SelectingListAdapter<T> {
    var callback: SelectingListAdapterCallback? = null
    ...
}
abstract class BaseSelectingListHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {
    abstract fun bindItem(item: T, isSelected: Boolean, onClick: (() -> Unit)?)
}


, SelectingListAdapterCallback.



interface SelectingListAdapterCallback {
    fun isItemSelected(position: Int): Boolean
    fun clickItem(position: Int)
}


, , , .

BaseSelectingListAdapter , LiveDataSource.



fun <T> setCallback(liveDataSource: LiveDataSource<T>) {
    callback = object : SelectingListAdapterCallback {
        override fun isItemSelected(position: Int) =
            liveDataSource.isItemSelected(position)
        override fun clickItem(position: Int) {
            liveDataSource.clickPosition(position)
        }
    }
}


BaseSelectingListAdapter β€” , .



    fun fullyInitialize(lifecycleOwner: LifecycleOwner,
                        liveDataSource: LiveDataSource<T>) {
        observeAllChanges(lifecycleOwner, liveDataSource)
        setCallback(liveDataSource)
    }


fullyInitialize, . . , , .



onCreateViewHolder bindItem. -, boilerplate .



class MyAdapter : BaseSelectingListAdapter<User, MyHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        MyHolder(...)//create your holder view
}
class MyHolder(itemView: View) : BaseSelectingListHolder<User>(itemView) {
    override fun bindItem(item: User, isSelected: Boolean, onClick: (() -> Unit)?) {
        //bind your data
    }
}




, . - , , :



  1. .
  2. ( , ), SelectionManager'.




:





Tautan di Gradle:



implementation 'ru.ircover.selectionmanager:core:1.1.0'

implementation 'ru.ircover.selectionmanager:livesource:1.0.1'

implementation 'ru.ircover.selectionmanager:selectingadapter:1.0.0'




All Articles