SDPTeam15/PolyEvents

View on GitHub
app/src/main/java/com/github/sdpteam15/polyevents/view/adapter/EventItemAdapter.kt

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package com.github.sdpteam15.polyevents.view.adapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.github.sdpteam15.polyevents.R
import com.github.sdpteam15.polyevents.model.entity.Event
import com.github.sdpteam15.polyevents.model.observable.ObservableList

/**
 * Adapts events to RecyclerView's ItemViewHolders
 * @param events The list of events to adapt
 * @param listener A listener that will be triggered on click of an ItemViewHolder element
 */
class EventItemAdapter(
    private val events: ObservableList<Event>,
    private val listener: (Event) -> Unit
) : RecyclerView.Adapter<EventItemAdapter.ItemViewHolder>() {

    /**
     * adapted ViewHolder for each event
     * Takes the corresponding event view
     */
    class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        private val eventName = view.findViewById<TextView>(R.id.id_event_name_text)
        private val eventSchedule = view.findViewById<TextView>(R.id.id_event_schedule_text)
        private val eventZone = view.findViewById<TextView>(R.id.id_event_zone)
        private val eventDescription = view.findViewById<TextView>(R.id.id_event_description)
        private val attendeesNumberTextView =
            view.findViewById<TextView>(R.id.event_card_attendees_number)

        /**
         * Binds the values of each field of an event to the layout of an event
         */
        fun bind(event: Event) {
            eventName.text = event.eventName
            eventSchedule.text = event.formattedStartTime()
            eventZone.text = event.zoneName
            eventDescription.text = event.description

            if (event.isLimitedEvent() && event.getMaxNumberOfSlots() != null) {
                attendeesNumberTextView.visibility = View.VISIBLE
                val maxNumberOfSlots = event.getMaxNumberOfSlots()
                val numberOfParticipants = event.getParticipants().size
                attendeesNumberTextView.text = itemView.resources.getString(
                    R.string.event_attendees,
                    numberOfParticipants,
                    maxNumberOfSlots
                )
            } else {
                attendeesNumberTextView.visibility = View.GONE
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val adapterLayout = LayoutInflater.from(parent.context)
            .inflate(R.layout.card_event, parent, false)
        return ItemViewHolder(adapterLayout)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val event = events[position]
        holder.bind(event)
        holder.itemView.setOnClickListener {
            listener(event)
        }
    }

    override fun getItemCount(): Int {
        return events.size
    }
}