Open Event Android allows the user to select multiple tickets for an event this blog post will guide you on how its done. Ticket Id and quantity of ticket selected is stored in the form of List of pair. The first element of the List is the Id of the ticket and the second element is its quantity.
private var tickeIdAndQty = ArrayList<Pair<Int, Int>>() |
Whenever the user selects any ticket using the dropdown the following snippet of code is executed. handleTicketSelect takes id and quantity of the selected ticket and search if any pair with passed id as the first element exists in the ticketIdAndQty list, if exists it updates that record else it inserts a new pair with given id and quantity into the list.
private fun handleTicketSelect(id: Int, quantity: Int) { val pos = ticketIdAndQty.map { it.first }.indexOf(id) if (pos == –1) { ticketIdAndQty.add(Pair(id, quantity)) } else { ticketIdAndQty[pos] = Pair(id, quantity) } |
When the user selects register the ticketIdAndQty list which contains details of selected tickets is added to the bundle along with the event id and are passed to attendee fragment. Attendee fragment allows the user to fill in other details such as country, payment option, first name etc.
Later attendee fragment with the help of attendee view model creates individual attendee on the server
rootView.register.setOnClickListener { if (!ticketsViewModel.totalTicketsEmpty(ticketIdAndQty)) { val fragment = AttendeeFragment() val bundle = Bundle() bundle.putLong(EVENT_ID, id) bundle.putSerializable(TICKET_ID_AND_QTY, ticketIdAndQty) fragment.arguments = bundle activity?.supportFragmentManager ?.beginTransaction() ?.replace(R.id.rootLayout, fragment) ?.addToBackStack(null) ?.commit() } else { handleNoTicketsSelected() } } |
When the register is selected an attendee is created for every ticket id inside ticketIdandQty list wherever the second element of the pair that is quantity is greater than zero. FFirst name last name, email and other information is taken from the text views populated on the screen and attendee object is created using these data. Lastly, createAttendee view model function is called passing the generated attendee, country, and selected payment option. The former calls service layer function and created an attendee by making a post request to the server.
ticketIdAndQty?.forEach { if (it.second > 0) { val attendee = Attendee(id = attendeeFragmentViewModel.getId(), firstname = firstName.text.toString(), lastname = lastName.text.toString(), email = email.text.toString(), ticket = TicketId(it.first.toLong()), event = eventId) val country = if (country.text.isEmpty()) country.text.toString() else null attendeeFragmentViewModel.createAttendee(attendee, id, country, selectedPaymentOption) } } |
The above-discussed procedure creates one attendee for every ticket quantity which means if a user select ticket id 1 with 3 quantity and ticket id 2 with 5 as quantity total 8 attendees will be generated. Later after successfully generating the attendee’s order is created. Every order has an array of attendees along with other other related information.
Resources
- Open Event Server Attendee Documentation – http://open-event-api-dev.herokuapp.com/#attendees
- Stack Overflow (List of Pair) – https://stackoverflow.com/questions/4777622/creating-a-list-of-pairs-in-java
- Room – https://developer.android.com/topic/libraries/architecture/room
- Kotlin Language Control Flow in Kotlin – https://kotlinlang.org/docs/reference/control-flow.html