RoboSwag/recyclerview-adapters
alex e34e78d163 changed version to constraints in roboswag modules 2020-06-05 19:19:36 +03:00
..
src/main fix outOfBoundsException in delegationListAdapter 2020-03-10 16:03:32 +03:00
.gitignore Migration to single repo 2018-09-27 13:52:59 +03:00
README.md Fix submodules' READMEs 2019-09-10 13:58:03 +03:00
build.gradle changed version to constraints in roboswag modules 2020-06-05 19:19:36 +03:00

README.md

recyclerview-adapters

Модуль, расширяющий возможности работы со стандартным RecyclerView.Adapter.

Основные интерфейсы и классы

DelegationListAdapter - базовый класс, наследник от RecyclerView.Adapter.

Конструктор принимает DiffUtil.ItemCallback - интерфейс, описывающий как различать элементы в адаптере. Он содержит два абстрактных метода: areItemsTheSame - метод, сравнивающий элементы, и areContentsTheSame - метод, сравнивающий визуальную составляющую элементов.

Например, возьмем список товаров, у которых есть уникальный id и title, который может повторяться. В RecyclerView отображается только название товара, т.е. title. В такой ситуации в методе areItemsTheSame нужно будет написать oldItem.id == newItem.id, а в методе areContentsTheSame - oldItem.title == newItem.title. Оба эти метода вычисляются в бэкграунд потоке.

Методы getHeadersCount и getFootersCount нужны, когда в списке есть элементы, которые всегда должны быть наверху или внизу. Например, если нужно добавить кнопку после всех элементов.

Управлением элементами списка занимаются делегаты. Они добавляются с помощью метода addDelegate.

ItemAdapterDelegate - делегат, который управляет созданием и прикреплением элементов в зависимости от типа элемента.

PositionAdapterDelegate - делегат, который управляет созданием и прикреплением элементов, основываясь на позиции элемента в DelegationListAdapter.

При реализации делегатов, необходимо описать два метода:

  • isForViewType - метод, который говорит делегату, должен ли он управлять соответсвующим элементом;
  • onBindViewHolder - метод, который описывает действия при прикреплении элемента к ViewHolder.

Примеры

Создание адаптера.

class SomeAdapter : DelegationListAdapter<Item>(CALLBACK) {

    companion object {
        private val CALLBACK = object : DiffUtil.ItemCallback<Item>() {
            override fun areItemsTheSame(oldItem: Item, newItem: Item) = newItem.id == oldItem.id
            override fun areContentsTheSame(oldItem: Item, newItem: Item) = newItem == oldItem
        }
    }

    init {
        addDelegate(HeaderDelegate())
        addDelegate(ItemDelegate())
        addDelegate(BottomDelegate())
    }
    
    // Some logic in your adapter
}

Создание делегата.

class HeaderDelegate(
        private val addAction: () -> Unit
) : PositionAdapterDelegate<RecyclerView.ViewHolder>() {

    override fun isForViewType(adapterPosition: Int): Boolean = adapterPosition == 0

    override fun onCreateViewHolder(parent: ViewGroup) =
            object : RecyclerView.ViewHolder(HeaderItemView()) {}

    override fun onBindViewHolder(
            holder: RecyclerView.ViewHolder,
            adapterPosition: Int, 
            payloads: MutableList<Any>
    ) = holder.itemView.setOnClickListener { addAction.invoke() }
}