Skip to content

Commit

Permalink
fix:Selected Items of Ticket Fragment do not retain on screen rotation
Browse files Browse the repository at this point in the history
Lifted ticketIdAndQty from view layer to viewModel and done required changes

feat: fossasia#1097
  • Loading branch information
pranavpandey1998official committed Feb 14, 2019
1 parent 4afa13b commit 379aa10
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,18 @@ import kotlinx.android.synthetic.main.item_ticket.view.ticketName

class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

fun bind(ticket: Ticket, selectedListener: TicketSelectedListener?, eventCurrency: String?) {
fun bind(ticket: Ticket, selectedListener: TicketSelectedListener?, eventCurrency: String?, quantity: Int) {
itemView.ticketName.text = ticket.name

itemView.order.text = quantity.toString()
if (ticket.minOrder > 0 && ticket.maxOrder > 0) {
val spinnerList = ArrayList<String>()
spinnerList.add("0")
for (i in ticket.minOrder..ticket.maxOrder) {
spinnerList.add(Integer.toString(i))
}
itemView.orderRange.adapter = ArrayAdapter(itemView.context, android.R.layout.select_dialog_singlechoice,
spinnerList)
itemView.orderRange.setSelection(quantity)
itemView.orderRange.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, pos: Int, id: Long) {
itemView.order.text = spinnerList[pos]
Expand All @@ -29,8 +32,6 @@ class TicketViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
override fun onNothingSelected(parent: AdapterView<*>) {
}
}
itemView.orderRange.adapter = ArrayAdapter(itemView.context, android.R.layout.select_dialog_singlechoice,
spinnerList)
}

itemView.order.setOnClickListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import org.fossasia.openevent.general.utils.Utils.getAnimSlide
import org.fossasia.openevent.general.utils.extensions.nonNull
import org.fossasia.openevent.general.utils.nullToEmpty
import org.koin.androidx.viewmodel.ext.android.viewModel
import java.io.Serializable

const val EVENT_ID: String = "EVENT_ID"
const val CURRENCY: String = "CURRENCY"
Expand Down Expand Up @@ -71,7 +72,7 @@ class TicketsFragment : Fragment() {

val ticketSelectedListener = object : TicketSelectedListener {
override fun onSelected(ticketId: Int, quantity: Int) {
handleTicketSelect(ticketId, quantity)
ticketsViewModel.handleTicketSelect(ticketId, quantity)
}
}
ticketsRecyclerAdapter.setSelectListener(ticketSelectedListener)
Expand Down Expand Up @@ -122,9 +123,15 @@ class TicketsFragment : Fragment() {
ticketsRecyclerAdapter.addAll(it)
ticketsRecyclerAdapter.notifyDataSetChanged()
})
ticketsViewModel.ticketIdAndQty
.nonNull()
.observe(this, Observer {
ticketsRecyclerAdapter.addAllTicketIdAndQty(it)
ticketsRecyclerAdapter.notifyDataSetChanged()
})

rootView.register.setOnClickListener {
if (!ticketsViewModel.totalTicketsEmpty(ticketIdAndQty)) {
if (!ticketsViewModel.totalTicketsEmpty(ticketsViewModel.ticketIdAndQty.value!!)) {
checkForAuthentication()
} else {
handleNoTicketsSelected()
Expand All @@ -146,7 +153,7 @@ class TicketsFragment : Fragment() {
private fun redirectToAttendee() {
val bundle = Bundle()
bundle.putLong(EVENT_ID, id)
bundle.putSerializable(TICKET_ID_AND_QTY, ticketIdAndQty)
bundle.putSerializable(TICKET_ID_AND_QTY, ticketsViewModel.ticketIdAndQty.value as Serializable)
findNavController(rootView).navigate(R.id.attendeeFragment, bundle, getAnimSlide())
}

Expand All @@ -156,15 +163,6 @@ class TicketsFragment : Fragment() {
findNavController(rootView).navigate(R.id.loginFragment, bundle, getAnimFade())
}

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)
}
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter<TicketViewHolder>() {
private val tickets = ArrayList<Ticket>()
private var eventCurrency: String? = null
private var selectedListener: TicketSelectedListener? = null
private val ticketIdAndQty = ArrayList<Pair<Int, Int>>()

fun addAll(ticketList: List<Ticket>) {
if (tickets.isNotEmpty())
Expand All @@ -32,12 +33,19 @@ class TicketsRecyclerAdapter : RecyclerView.Adapter<TicketViewHolder>() {

override fun onBindViewHolder(holder: TicketViewHolder, position: Int) {
val event = tickets[position]
holder.bind(event, selectedListener, eventCurrency)
val quantity = ticketIdAndQty.find { event.id == it.first }?.second ?: 0
holder.bind(event, selectedListener, eventCurrency, quantity)
}

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

fun addAllTicketIdAndQty(it: ArrayList<Pair<Int, Int>>) {
if (ticketIdAndQty.isNotEmpty())
this.ticketIdAndQty.clear()
this.ticketIdAndQty.addAll(it)
}
}

interface TicketSelectedListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ class TicketsViewModel(
val event: LiveData<Event> = mutableEvent
private val mutableTicketTableVisibility = MutableLiveData<Boolean>()
val ticketTableVisibility: LiveData<Boolean> = mutableTicketTableVisibility
private val mutableTicketIdAndQty = MutableLiveData<ArrayList<Pair<Int, Int>>>()
val ticketIdAndQty = mutableTicketIdAndQty

fun isLoggedIn() = authHolder.isLoggedIn()

Expand Down Expand Up @@ -76,4 +78,12 @@ class TicketsViewModel(
super.onCleared()
compositeDisposable.clear()
}
fun handleTicketSelect(id: Int, quantity: Int) {
val pos = mutableTicketIdAndQty.value?.map { it.first }?.indexOf(id) ?: -1
if (pos == -1) {
mutableTicketIdAndQty.value?.add(Pair(id, quantity))
} else {
mutableTicketIdAndQty.value?.set(pos, Pair(id, quantity))
}
}
}

0 comments on commit 379aa10

Please sign in to comment.