MicroUtils/android/recyclerview/src/androidMain/kotlin/dev/inmo/micro_utils/android/recyclerview/RecyclerViewAdapter.kt

92 lines
3.0 KiB
Kotlin
Raw Normal View History

2020-11-10 11:09:14 +00:00
package dev.inmo.micro_utils.android.recyclerview
import android.view.View
2021-06-15 08:24:00 +00:00
import android.view.ViewGroup
2020-11-10 11:09:14 +00:00
import androidx.recyclerview.widget.RecyclerView
2021-06-17 07:39:02 +00:00
import kotlinx.coroutines.flow.*
2020-11-10 11:09:14 +00:00
2021-06-15 08:24:00 +00:00
abstract class RecyclerViewAdapter<T>: RecyclerView.Adapter<AbstractViewHolder<T>>() {
protected abstract val data: List<T>
2021-06-17 07:39:02 +00:00
private val _dataCountState by lazy {
MutableStateFlow<Int>(data.size)
}
val dataCountState: StateFlow<Int> by lazy {
_dataCountState.asStateFlow()
}
2020-11-10 11:09:14 +00:00
var emptyView: View? = null
set(value) {
field = value
checkEmpty()
}
init {
registerAdapterDataObserver(
object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeChanged(positionStart: Int, itemCount: Int) {
super.onItemRangeChanged(positionStart, itemCount)
2021-06-17 07:39:02 +00:00
_dataCountState.value = data.size
2020-11-10 11:09:14 +00:00
checkEmpty()
}
override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) {
super.onItemRangeChanged(positionStart, itemCount, payload)
2021-06-17 07:39:02 +00:00
_dataCountState.value = data.size
2020-11-10 11:09:14 +00:00
checkEmpty()
}
override fun onChanged() {
super.onChanged()
2021-06-17 07:39:02 +00:00
_dataCountState.value = data.size
2020-11-10 11:09:14 +00:00
checkEmpty()
}
override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
super.onItemRangeRemoved(positionStart, itemCount)
2021-06-17 07:39:02 +00:00
_dataCountState.value = data.size
2020-11-10 11:09:14 +00:00
checkEmpty()
}
override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) {
super.onItemRangeMoved(fromPosition, toPosition, itemCount)
2021-06-17 07:39:02 +00:00
_dataCountState.value = data.size
2020-11-10 11:09:14 +00:00
checkEmpty()
}
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
super.onItemRangeInserted(positionStart, itemCount)
2021-06-17 07:39:02 +00:00
_dataCountState.value = data.size
2020-11-10 11:09:14 +00:00
checkEmpty()
}
}
)
checkEmpty()
}
override fun getItemCount(): Int = data.size
override fun onBindViewHolder(holder: AbstractViewHolder<T>, position: Int) {
holder.onBind(data[position])
}
private fun checkEmpty() {
emptyView ?. let {
2021-06-17 07:39:02 +00:00
if (dataCountState.value == 0) {
2020-11-10 11:09:14 +00:00
it.visibility = View.VISIBLE
} else {
it.visibility = View.GONE
}
}
}
}
2021-06-15 08:24:00 +00:00
fun <T> RecyclerViewAdapter(
data: List<T>,
onCreateViewHolder: (parent: ViewGroup, viewType: Int) -> AbstractViewHolder<T>
) = object : RecyclerViewAdapter<T>() {
override val data: List<T> = data
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractViewHolder<T> = onCreateViewHolder(parent, viewType)
}