소스 검색

Added common implementation for recycler view adapter with headers

Vadik Sirekanyan 7 년 전
부모
커밋
85cf833913

+ 41 - 0
app/src/main/java/com/sirekanyan/knigopis/common/adapter/CommonAdapter.kt

@@ -0,0 +1,41 @@
+package com.sirekanyan.knigopis.common.adapter
+
+import android.support.v7.recyclerview.extensions.ListAdapter
+import android.view.ViewGroup
+
+private fun <T : CommonModel> createItemCallback() =
+    SimpleItemCallback<T> { item ->
+        if (item.isHeader) {
+            item.header.id
+        } else {
+            item.data.id
+        }
+    }
+
+abstract class CommonAdapter<T : CommonModel> :
+    ListAdapter<T, CommonViewHolder<T>>(createItemCallback<T>()) {
+
+    private companion object {
+        private const val HEADER_TYPE = 0
+        private const val DATA_TYPE = 1
+    }
+
+    abstract fun onCreateHeaderViewHolder(parent: ViewGroup): CommonViewHolder<T>
+
+    abstract fun onCreateDataViewHolder(parent: ViewGroup): CommonViewHolder<T>
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CommonViewHolder<T> =
+        if (viewType == HEADER_TYPE) {
+            onCreateHeaderViewHolder(parent)
+        } else {
+            onCreateDataViewHolder(parent)
+        }
+
+    override fun onBindViewHolder(holder: CommonViewHolder<T>, position: Int) {
+        holder.bind(position, getItem(position))
+    }
+
+    override fun getItemViewType(position: Int): Int =
+        if (getItem(position).isHeader) HEADER_TYPE else DATA_TYPE
+
+}

+ 17 - 0
app/src/main/java/com/sirekanyan/knigopis/common/adapter/CommonModel.kt

@@ -0,0 +1,17 @@
+package com.sirekanyan.knigopis.common.adapter
+
+interface CommonModel {
+
+    val isHeader: Boolean
+    val header: Header
+    val data: Data
+
+    interface Header {
+        val id: String
+    }
+
+    interface Data {
+        val id: String
+    }
+
+}

+ 19 - 0
app/src/main/java/com/sirekanyan/knigopis/common/adapter/CommonViewHolder.kt

@@ -0,0 +1,19 @@
+package com.sirekanyan.knigopis.common.adapter
+
+import android.support.v7.widget.RecyclerView
+import android.view.View
+
+abstract class CommonViewHolder<T : CommonModel>(
+    view: View
+) : RecyclerView.ViewHolder(view) {
+
+    protected var model: T? = null
+
+    abstract fun onBind(position: Int, model: T)
+
+    fun bind(position: Int, model: T) {
+        this.model = model
+        onBind(position, model)
+    }
+
+}

+ 11 - 0
app/src/main/java/com/sirekanyan/knigopis/common/adapter/SimpleItemCallback.kt

@@ -0,0 +1,11 @@
+package com.sirekanyan.knigopis.common.adapter
+
+import android.support.v7.util.DiffUtil.ItemCallback
+
+class SimpleItemCallback<T>(private val getId: (T) -> String) : ItemCallback<T>() {
+
+    override fun areItemsTheSame(oldItem: T, newItem: T) = getId(oldItem) == getId(newItem)
+
+    override fun areContentsTheSame(oldItem: T, newItem: T) = areItemsTheSame(oldItem, newItem)
+
+}