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) } } } } } }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter