Created
March 10, 2020 15:19
-
-
Save Urdzik/ba77257ef3a7088d8affd457818dbdc8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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