Skip to content

Instantly share code, notes, and snippets.

@zamahaka
Created October 16, 2019 09:27
Show Gist options
  • Save zamahaka/13cb1718d3e1fb77928c4e9a8592a3fb to your computer and use it in GitHub Desktop.
Save zamahaka/13cb1718d3e1fb77928c4e9a8592a3fb to your computer and use it in GitHub Desktop.
package com.deguvino.mobile.deguvino.activity.fragment.menu.exhibition.winelist.winelistviewholders
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.RecyclerView
import com.deguvino.mobile.deguvino.R
import com.deguvino.mobile.deguvino.activity.fragment.menu.exhibition.winelist.winelistviewmodels.WineBodyViewModel
import com.deguvino.mobile.deguvino.activity.fragment.menu.exhibition.winelist.winelistviewmodels.WineHeaderViewModel
import com.deguvino.mobile.deguvino.activity.fragment.menu.exhibition.winelist.winelistviewmodels.WineSubHeaderViewModel
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_wine_list_body.view.*
import kotlinx.android.synthetic.main.item_wine_list_header.*
import kotlinx.android.synthetic.main.item_wine_list_sub_header.*
// base rv
abstract class BaseRvViewHolder(
override val containerView: View
) : RecyclerView.ViewHolder(containerView), LayoutContainer
// base rv
interface ViewHolderViewCreator {
@get:LayoutRes
val layoutId: Int
fun inflate(parent: ViewGroup) = LayoutInflater.from(parent.context)
.inflate(WineHeaderViewHolder.layoutId, parent, false)
}
// base rv
interface BindViewHolder<T> {
fun bind(data: T)
}
sealed class WineListViewHolder(containerView: View) : BaseRvViewHolder(containerView)
class WineHeaderViewHolder private constructor(
view: View,
onClick: (Int) -> Unit
) : WineListViewHolder(view), BindViewHolder<WineHeaderViewModel> {
// ViewExtensions.kt
private fun View.onClick(handler: () -> Unit) = setOnClickListener { handler() }
// RvViewHolderExtensions.kt
private fun RecyclerView.ViewHolder.onClick(view: View, handler: (Int) -> Unit) {
view.onClick {
adapterPosition.takeIf { it != RecyclerView.NO_POSITION }?.let(handler)
}
}
init {
onClick(ivWineHeaderIndicator, onClick)
}
override fun bind(data: WineHeaderViewModel) {
tvWineHeaderTitle.text = data.title
ivWineHeaderIndicator.setImageResource(data.headerIndicator)
}
companion object : ViewHolderViewCreator {
override val layoutId: Int = R.layout.item_wine_list_header
operator fun invoke(parent: ViewGroup, l: (Int) -> Unit) = WineHeaderViewHolder(
inflate(parent), l
)
}
}
class WineSubHeaderViewHolder private constructor(view: View) : WineListViewHolder(view) {
fun bind(subHeaderViewModel: WineSubHeaderViewModel) {
tvWineSubHeaderTitle.text = subHeaderViewModel.title
}
}
class WineBodyViewHolder(
view: View
) : WineListViewHolder(view) {
private val name = view.tvWineName
private val year = view.tvWineYear
private val rate = view.tvWineRate
private val volume = view.tvWineVolume
private val grapeTitle = view.tvGrapeTitle
private val editComment = view.etEditComment
fun bind(wineBodyViewModel: WineBodyViewModel) {
name.text = wineBodyViewModel.name
year.text = wineBodyViewModel.year
rate.text = wineBodyViewModel.rating
volume.text = wineBodyViewModel.volume
grapeTitle.text = wineBodyViewModel.grapeTitle
editComment.setText(wineBodyViewModel.grapeTitle)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment