/app/src/main/java/com/sesz/beatplayer/ui/adapters/ArtistAdapter.kt

https://github.com/Charlieras262/BeatPlayer · Kotlin · 136 lines · 118 code · 18 blank · 0 comment · 19 complexity · 2a41a072878a782ef3a00d35f42239c3 MD5 · raw file

  1. package com.sesz.beatplayer.ui.adapters
  2. import android.content.Context
  3. import android.os.SystemClock
  4. import android.view.View
  5. import android.view.ViewGroup
  6. import androidx.recyclerview.widget.RecyclerView
  7. import com.sesz.beatplayer.R
  8. import com.sesz.beatplayer.alertdialog.utils.ViewUtils.dip2px
  9. import com.sesz.beatplayer.databinding.ArtistItemBinding
  10. import com.sesz.beatplayer.databinding.ArtistItemHeaderBinding
  11. import com.sesz.beatplayer.extensions.inflateWithBinding
  12. import com.sesz.beatplayer.interfaces.ItemClickListener
  13. import com.sesz.beatplayer.models.Artist
  14. import com.sesz.beatplayer.utils.GeneralUtils.screenWidth
  15. private const val HEADER_TYPE = 0
  16. private const val ITEM_TYPE = 1
  17. class ArtistAdapter(private val context: Context?) :
  18. RecyclerView.Adapter<RecyclerView.ViewHolder>() {
  19. var artistList: List<Artist> = emptyList()
  20. var showHeader: Boolean = false
  21. var itemClickListener: ItemClickListener<Artist>? = null
  22. var spanCount: Int = 0
  23. private var lastClick = 0L
  24. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
  25. return when (viewType) {
  26. HEADER_TYPE -> {
  27. val viewBinding =
  28. parent.inflateWithBinding<ArtistItemHeaderBinding>(R.layout.artist_item_header)
  29. ViewHolderAlbumHeader(viewBinding)
  30. }
  31. ITEM_TYPE -> {
  32. val viewBinding = parent.inflateWithBinding<ArtistItemBinding>(R.layout.artist_item)
  33. ViewHolderArtist(viewBinding)
  34. }
  35. else -> {
  36. val viewBinding = parent.inflateWithBinding<ArtistItemBinding>(R.layout.artist_item)
  37. ViewHolderArtist(viewBinding)
  38. }
  39. }
  40. }
  41. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  42. val currentSong = if (!artistList.isNullOrEmpty()) getItem(position) else null
  43. when (getItemViewType(position)) {
  44. HEADER_TYPE -> {
  45. (holder as ViewHolderAlbumHeader).bind(artistList.size)
  46. }
  47. ITEM_TYPE -> {
  48. (holder as ViewHolderArtist).bind(currentSong!!)
  49. }
  50. }
  51. }
  52. override fun getItemViewType(position: Int): Int {
  53. return if (showHeader && position == 0) {
  54. HEADER_TYPE
  55. } else {
  56. ITEM_TYPE
  57. }
  58. }
  59. override fun getItemCount() = if (showHeader) {
  60. artistList.size + 1
  61. } else {
  62. artistList.size
  63. }
  64. fun getItem(position: Int): Artist? {
  65. return if (showHeader) {
  66. if (position == 0) {
  67. null
  68. } else {
  69. artistList[position - 1]
  70. }
  71. } else {
  72. artistList[position]
  73. }
  74. }
  75. fun updateDataSet(newList: List<Artist>) {
  76. this.artistList = newList
  77. notifyDataSetChanged()
  78. }
  79. inner class ViewHolderArtist(private val binding: ArtistItemBinding) :
  80. RecyclerView.ViewHolder(binding.root), View.OnClickListener {
  81. fun bind(artist: Artist) {
  82. binding.apply {
  83. this.artist = artist
  84. executePendingBindings()
  85. showDetails.setOnClickListener(this@ViewHolderArtist)
  86. container.layoutParams.apply {
  87. height = screenWidth / spanCount + dip2px(context!!, 42)
  88. width = screenWidth / spanCount - dip2px(context, 6)
  89. }
  90. }
  91. }
  92. override fun onClick(view: View) {
  93. if (SystemClock.elapsedRealtime() - lastClick < 300) {
  94. return
  95. }
  96. lastClick = SystemClock.elapsedRealtime()
  97. if (itemClickListener != null) itemClickListener!!.onItemClick(
  98. view,
  99. adapterPosition,
  100. getItem(adapterPosition)!!
  101. )
  102. }
  103. }
  104. inner class ViewHolderAlbumHeader(private val binding: ArtistItemHeaderBinding) :
  105. RecyclerView.ViewHolder(binding.root), View.OnClickListener {
  106. fun bind(artistCount: Int) {
  107. binding.apply {
  108. this.artistCount = artistCount
  109. executePendingBindings()
  110. sortArtist.setOnClickListener(this@ViewHolderAlbumHeader)
  111. }
  112. }
  113. override fun onClick(view: View) {
  114. if (itemClickListener != null)
  115. itemClickListener!!.onSortClick(view)
  116. }
  117. }
  118. }