2020-10-14 20:22:20 +02:00
package org.mosad.teapod.util.adapter
2020-10-08 22:20:20 +02:00
import android.view.LayoutInflater
import android.view.ViewGroup
2020-10-15 13:00:44 +02:00
import android.widget.Filter
import android.widget.Filterable
import androidx.recyclerview.widget.RecyclerView
2020-10-08 22:20:20 +02:00
import com.bumptech.glide.Glide
2020-11-25 22:35:55 +01:00
import org.mosad.teapod.databinding.ItemMediaBinding
2020-10-16 19:56:08 +02:00
import org.mosad.teapod.util.ItemMedia
2020-10-11 18:07:00 +02:00
import java.util.*
2020-10-08 22:20:20 +02:00
2020-12-06 15:18:15 +01:00
class MediaItemAdapter ( private val initMedia : List < ItemMedia > ) : RecyclerView . Adapter < MediaItemAdapter . MediaViewHolder > ( ) , Filterable {
2020-10-11 18:07:00 +02:00
2020-10-16 19:56:08 +02:00
var onItemClick : ( ( Int , Int ) -> Unit ) ? = null
2020-10-15 13:00:44 +02:00
private val filter = MediaFilter ( )
2020-12-06 15:18:15 +01:00
private var filteredMedia = initMedia . map { it . copy ( ) }
2020-10-11 18:07:00 +02:00
2020-11-25 22:35:55 +01:00
override fun onCreateViewHolder ( parent : ViewGroup , viewType : Int ) : MediaItemAdapter . MediaViewHolder {
return MediaViewHolder ( ItemMediaBinding . inflate ( LayoutInflater . from ( parent . context ) , parent , false ) )
2020-10-08 22:20:20 +02:00
}
2020-11-25 22:35:55 +01:00
override fun onBindViewHolder ( holder : MediaItemAdapter . MediaViewHolder , position : Int ) {
holder . binding . root . apply {
holder . binding . textTitle . text = filteredMedia [ position ] . title
Glide . with ( context ) . load ( filteredMedia [ position ] . posterUrl ) . into ( holder . binding . imagePoster )
2020-10-15 13:00:44 +02:00
}
2020-10-11 18:07:00 +02:00
}
2020-10-15 13:00:44 +02:00
override fun getItemCount ( ) : Int {
2020-10-11 18:07:00 +02:00
return filteredMedia . size
}
2020-10-15 13:00:44 +02:00
override fun getFilter ( ) : Filter {
return filter
2020-10-11 18:07:00 +02:00
}
2020-12-06 15:18:15 +01:00
fun updateMediaList ( mediaList : List < ItemMedia > ) {
filteredMedia = mediaList
}
2020-11-25 22:35:55 +01:00
inner class MediaViewHolder ( val binding : ItemMediaBinding ) : RecyclerView . ViewHolder ( binding . root ) {
2020-10-15 13:00:44 +02:00
init {
2020-11-25 22:35:55 +01:00
binding . root . setOnClickListener {
2020-10-16 19:56:08 +02:00
onItemClick ?. invoke ( filteredMedia [ adapterPosition ] . id , adapterPosition )
2020-10-15 13:00:44 +02:00
}
}
2020-10-11 18:07:00 +02:00
}
2020-10-14 20:58:42 +02:00
inner class MediaFilter : Filter ( ) {
2020-10-11 18:07:00 +02:00
override fun performFiltering ( constraint : CharSequence ? ) : FilterResults {
2021-05-09 19:32:31 +02:00
val filterTerm = constraint . toString ( ) . lowercase ( Locale . ROOT )
2020-10-11 18:07:00 +02:00
val results = FilterResults ( )
val filteredList = if ( filterTerm . isEmpty ( ) ) {
2020-12-06 15:18:15 +01:00
initMedia
2020-10-11 18:07:00 +02:00
} else {
2020-12-06 15:18:15 +01:00
initMedia . filter {
2021-05-09 19:32:31 +02:00
it . title . lowercase ( Locale . ROOT ) . contains ( filterTerm )
2020-10-11 18:07:00 +02:00
}
}
results . values = filteredList
results . count = filteredList . size
return results
}
2020-10-14 20:58:42 +02:00
@Suppress ( " unchecked_cast " )
/ * *
* suppressing unchecked cast is safe , since we only use Media
* /
2020-10-11 18:07:00 +02:00
override fun publishResults ( constraint : CharSequence ? , results : FilterResults ? ) {
2020-10-16 19:56:08 +02:00
filteredMedia = results ?. values as List < ItemMedia >
2020-10-11 18:07:00 +02:00
notifyDataSetChanged ( )
}
}
2020-10-08 22:20:20 +02:00
}