Skip to content

Instantly share code, notes, and snippets.

@Urdzik
Created March 10, 2020 15:19
Show Gist options
  • Save Urdzik/ba77257ef3a7088d8affd457818dbdc8 to your computer and use it in GitHub Desktop.
Save Urdzik/ba77257ef3a7088d8affd457818dbdc8 to your computer and use it in GitHub Desktop.
private val ITEM_VIEW_TYPE_HEADER = 0
private val ITEM_VIEW_TYPE_ITEM = 1
class TopRatedMovieAdapter(private val clickListener: MovieListener) :
ListAdapter<DataItem, RecyclerView.ViewHolder>(MovieNightDiffCallback()) {
private val adapterScope = CoroutineScope(Dispatchers.Default)
fun addHeaderAndSubmitList(list: List<SmallMovieList>?) {
adapterScope.launch {
val items = when (list) {
null -> listOf(DataItem.Header)
else -> list.map { DataItem.MovieItem(it) } + listOf(DataItem.Header)
}
withContext(Dispatchers.Main) {
submitList(items)
}
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is ViewHolder -> {
val movieItem = getItem(position) as DataItem.MovieItem
holder.itemView.setOnClickListener {
clickListener.onClick(movieItem.movie)
}
holder.bind(movieItem.movie)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
ITEM_VIEW_TYPE_HEADER -> TextViewHolder.from(parent)
ITEM_VIEW_TYPE_ITEM -> ViewHolder.from(parent)
else -> throw ClassCastException("Unknown viewType ${viewType}")
}
}
override fun getItemViewType(position: Int): Int {
return when (getItem(position)) {
is DataItem.Header -> ITEM_VIEW_TYPE_HEADER
is DataItem.MovieItem -> ITEM_VIEW_TYPE_ITEM
}
}
class TextViewHolder(view: View) : RecyclerView.ViewHolder(view) {
companion object {
fun from(parent: ViewGroup): TextViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.button_full, parent, false)
return TextViewHolder(view)
}
}
}
class ViewHolder private constructor(val binding: ItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: SmallMovieList) {
binding.movie = item
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = ItemBinding.inflate(layoutInflater, parent, false)
return ViewHolder(binding)
}
}
}
}
class MovieNightDiffCallback : DiffUtil.ItemCallback<DataItem>() {
override fun areItemsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
return oldItem.id == newItem.id
}
@SuppressLint("DiffUtilEquals")
override fun areContentsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
return oldItem == newItem
}
}
sealed class DataItem {
data class MovieItem(val movie: SmallMovieList) : DataItem() {
override val id = movie.id.toLong()
}
object Header : DataItem() {
override val id = Long.MIN_VALUE
}
abstract val id: Long
}
class MovieListener(val clickListener: (movie: SmallMovieList) -> Unit) {
fun onClick(movie: SmallMovieList) = clickListener(movie)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment