package adapter
import android.content.Context
import android.view.ViewGroup
import androidx.collection.SparseArrayCompat
import androidx.recyclerview.widget.RecyclerView
import domain.ViewType
import domain.movie.ListaItemFilme
import pessoaspopulares.adapter.LoadingDelegateAdapter
import pessoaspopulares.adapter.ViewTypeDelegateAdapter
import utils.Constant
/**
* Created by icaro on 14/08/16.
*/
class ListUserAdapter(private val context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val listaResult = ArrayList<ViewType>()
private val delegateAdapters = SparseArrayCompat<ViewTypeDelegateAdapter>()
init {
delegateAdapters.put(Constant.ViewTypesIds.LOADING, LoadingDelegateAdapter())
delegateAdapters.put(Constant.ViewTypesIds.NEWS, ListasDelegateAdapter())
listaResult.add(loading)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return delegateAdapters.get(viewType)!!.onCreateViewHolder(parent)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
delegateAdapters.get(getItemViewType(position))?.onBindViewHolder(holder, listaResult[position], context)
}
override fun getItemViewType(position: Int): Int {
return listaResult[position].getViewType()
}
fun addItens(listaMedia: List<ListaItemFilme?>?, totalResults: Int) {
if (listaMedia?.isNotEmpty()!!) {
val initPosition = listaResult.size - 1
this.listaResult.removeAt(initPosition)
notifyItemRemoved(initPosition)
for (result in listaMedia) {
this.listaResult.add(result!!)
}
this.listaResult.sortedBy { (it as ListaItemFilme).releaseDate }
.reversed()
notifyItemRangeChanged(initPosition, this.listaResult.size + 1 /* plus loading item */)
if (listaResult.size < totalResults)
this.listaResult.add(loading)
}
}
override fun getItemCount(): Int = listaResult.size
companion object {
private val loading = object : ViewType {
override fun getViewType(): Int {
return Constant.ViewTypesIds.LOADING
}
}
}
}
@Keep
interface ViewType {
fun getViewType(): Int
}
interface ViewTypeDelegateAdapter {
fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder
fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: ViewType?, context: Context?)
}
class LoadingDelegateAdapter : ViewTypeDelegateAdapter {
override fun onCreateViewHolder(parent: ViewGroup) = LoadingViewHolder(parent)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: ViewType?, context: Context?) {
}
class LoadingViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context)
.inflate(R.layout.new_item_loading, parent, false))
}
class ListasDelegateAdapter : ViewTypeDelegateAdapter {
override fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder =
ListViewHolder(parent)
override fun onBindViewHolder(
holder: RecyclerView.ViewHolder,
item: ViewType?,
context: Context?
) {
(holder as ListViewHolder).bind(item as ListaItemFilme)
}
inner class ListViewHolder(parent: ViewGroup) :
RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.lista, parent, false)
) {
fun bind(item: ListaItemFilme) = with(itemView) {
img_lista.setPicassoWithCache(item.posterPath, 3)
when (item.mediaType) {
"tv" -> date_oscar.text =
if (!item.first_air_date.isNullOrEmpty() && item.first_air_date.length > 3)
item.first_air_date.subSequence(0, 4) else "-"
"movie" -> date_oscar.text =
if (!item.releaseDate.isNullOrEmpty() && item.releaseDate.length > 3)
item.releaseDate.subSequence(0, 4) else "-"
}
progress.visibility = View.GONE
itemView.setOnClickListener {
when (item.mediaType) {
"tv" -> {
val intent = Intent(context, TvShowActivity::class.java).apply {
putExtra(Constant.TVSHOW_ID, item.id)
putExtra(Constant.COLOR_TOP, UtilsApp.loadPalette(img_lista))
}
context.startActivity(intent)
}
"movie" -> {
val intent = Intent(context, MovieDetailsActivity::class.java).apply {
putExtra(Constant.FILME_ID, item.id)
putExtra(Constant.COLOR_TOP, UtilsApp.loadPalette(img_lista))
}
context.startActivity(intent)
}
}
}
}
}
}