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.View
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-10-15 13:00:44 +02:00
import kotlinx.android.synthetic.main.item_media.view.*
2020-10-08 22:20:20 +02:00
import org.mosad.teapod.R
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-10-16 19:56:08 +02:00
class MediaItemAdapter ( private val media : List < ItemMedia > ) : RecyclerView . Adapter < MediaItemAdapter . ViewHolder > ( ) , 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 ( )
private var filteredMedia = media . map { it . copy ( ) }
2020-10-11 18:07:00 +02:00
2020-10-15 13:00:44 +02:00
override fun onCreateViewHolder ( parent : ViewGroup , viewType : Int ) : MediaItemAdapter . ViewHolder {
val view = LayoutInflater . from ( parent . context ) . inflate ( R . layout . item _media , parent , false )
2020-10-08 22:20:20 +02:00
2020-10-15 13:00:44 +02:00
return ViewHolder ( view )
2020-10-08 22:20:20 +02:00
}
2020-10-15 13:00:44 +02:00
override fun onBindViewHolder ( holder : MediaItemAdapter . ViewHolder , position : Int ) {
holder . view . apply {
text _title . text = filteredMedia [ position ] . title
2020-10-16 19:56:08 +02:00
Glide . with ( context ) . load ( filteredMedia [ position ] . posterUrl ) . into ( image _poster )
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-10-15 13:00:44 +02:00
inner class ViewHolder ( val view : View ) : RecyclerView . ViewHolder ( view ) {
init {
view . 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 {
val filterTerm = constraint . toString ( ) . toLowerCase ( Locale . ROOT )
val results = FilterResults ( )
val filteredList = if ( filterTerm . isEmpty ( ) ) {
2020-10-15 13:00:44 +02:00
media
2020-10-11 18:07:00 +02:00
} else {
2020-10-15 13:00:44 +02:00
media . filter {
2020-10-11 18:07:00 +02:00
it . title . toLowerCase ( Locale . ROOT ) . contains ( filterTerm )
}
}
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
}