teapod/app/src/main/java/org/mosad/teapod/util/adapter/MediaItemAdapter.kt

79 lines
2.6 KiB
Kotlin
Raw Normal View History

package org.mosad.teapod.util.adapter
2020-10-08 22:20:20 +02:00
import android.view.LayoutInflater
import android.view.ViewGroup
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
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
var onItemClick: ((Int, Int) -> Unit)? = null
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-11 18:07:00 +02:00
}
override fun getItemCount(): Int {
2020-10-11 18:07:00 +02:00
return filteredMedia.size
}
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) {
init {
2020-11-25 22:35:55 +01:00
binding.root.setOnClickListener {
onItemClick?.invoke(filteredMedia[adapterPosition].id, adapterPosition)
}
}
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().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 {
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?) {
filteredMedia = results?.values as List<ItemMedia>
2020-10-11 18:07:00 +02:00
notifyDataSetChanged()
}
}
2020-10-08 22:20:20 +02:00
}