Add new history adapter

feature/top10
Aurelien Hubert 7 years ago
parent 1b774663b6
commit 36b1dddec4
  1. 165
      app/src/main/java/net/pokeranalytics/android/ui/adapter/HistoryRowRepresentableAdapter.kt
  2. 44
      app/src/main/java/net/pokeranalytics/android/ui/fragment/HistoryFragment.kt

@ -4,15 +4,17 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.widget.AppCompatTextView import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.realm.RealmResults import io.realm.RealmResults
import kotlinx.android.synthetic.main.row_history_session.view.* import kotlinx.android.synthetic.main.row_history_session.view.*
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.view.BindableHolder import net.pokeranalytics.android.ui.view.BindableHolder
import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.util.extensions.getMonthAndYear
import timber.log.Timber
import java.util.*
import kotlin.collections.HashMap
/** /**
@ -23,35 +25,15 @@ import net.pokeranalytics.android.ui.view.RowViewType
class HistoryRowRepresentableAdapter( class HistoryRowRepresentableAdapter(
var realmResults: RealmResults<Session>, var realmResults: RealmResults<Session>,
var delegate: RowRepresentableDelegate? = null, var delegate: RowRepresentableDelegate? = null,
var headers: ArrayList<String> var headers: RealmResults<Session>
) : ) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() { RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var headersPositions: HashMap<String, Int> = HashMap() private var headersPositions = HashMap<Int, Date>()
private var headersDisplayed: ArrayList<String> = ArrayList() private lateinit var sortedHeaders: SortedMap<Int, Date>
private var headersPositions2: HashMap<Int, String> = HashMap()
private var viewTypesPositions: ArrayList<Int> = ArrayList()
init { init {
refreshData()
val start = System.currentTimeMillis()
headersPositions2.clear()
viewTypesPositions.clear()
/*
for (session in realmResults) {
if (!headersPositions2.containsValue(session.groupByMonth)) {
headersPositions2[viewTypesPositions.size] = session.groupByMonth
viewTypesPositions.add(RowViewType.HEADER_TITLE.ordinal)
}
viewTypesPositions.add(RowViewType.ROW_SESSION.ordinal)
}
Timber.d("Create viewTypesPositions in: ${System.currentTimeMillis() - start}ms")
*/
} }
/** /**
@ -72,58 +54,15 @@ class HistoryRowRepresentableAdapter(
* Display a session view * Display a session view
*/ */
inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder { inner class HeaderTitleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), BindableHolder {
fun bind(position: Int, value: String?, adapter: HistoryRowRepresentableAdapter) { fun bind(position: Int, session: Session?, adapter: HistoryRowRepresentableAdapter) {
// Title // Title
itemView.findViewById<AppCompatTextView>(R.id.title)?.let { itemView.findViewById<AppCompatTextView>(R.id.title)?.let {
it.text = value ?: "" it.text = session?.creationDate?.getMonthAndYear()
} }
} }
} }
override fun getItemViewType(position: Int): Int {
return viewTypesPositions[position]
/*
if (position < headers.size) {
return RowViewType.HEADER_TITLE.ordinal
} else {
return RowViewType.ROW_SESSION.ordinal
}*/
/*
var nbHeaders = 0
for (key in headersPositions2.keys) {
if (position < key) {
nbHeaders++
}
}
val realIndex = position - nbHeaders
//val realIndex = getRealIndex(position)//position - headersPositions.size
val month = realmResults[realIndex]?.groupByMonth ?: ""
if (headersPositions.containsKey(month) || headersPositions[month] == position) {
return RowViewType.ROW_SESSION.ordinal//this.dataSource.viewTypeForPosition(position)
} else {
headersPositions[month] = position
return RowViewType.HEADER_TITLE.ordinal
}
*/
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
//val rowViewType: RowViewType = RowViewType.values()[viewType]
//return rowViewType.viewHolder(parent)
if (viewType == RowViewType.ROW_SESSION.ordinal) { if (viewType == RowViewType.ROW_SESSION.ordinal) {
val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_history_session, parent, false) val layout = LayoutInflater.from(parent.context).inflate(R.layout.row_history_session, parent, false)
return RowSessionViewHolder(layout) return RowSessionViewHolder(layout)
@ -134,81 +73,77 @@ class HistoryRowRepresentableAdapter(
} }
var size = 0
override fun getItemCount(): Int {
size++
override fun getItemViewType(position: Int): Int {
if (sortedHeaders.containsKey(position)) {
return RowViewType.HEADER_TITLE.ordinal
} else {
return RowViewType.ROW_SESSION.ordinal
}
}
return realmResults.size + headers.size + size override fun getItemCount(): Int {
return realmResults.size + headers.size
} }
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is RowSessionViewHolder) { if (holder is RowSessionViewHolder) {
holder.bind(position, realmResults[getRealIndex(position)], this) holder.bind(position, realmResults[getRealIndex(position)], this)
} else if (holder is HeaderTitleViewHolder) { } else if (holder is HeaderTitleViewHolder) {
holder.bind(position, headers[getRealIndex(position)], this) holder.bind(position, headers[getRealIndex(position)], this)
} }
/*
this.dataSource.rowRepresentableForPosition(position)?.let {
(holder as RowSessionViewHolder).bind(position, getItem(position), this)
}
*/
} }
/** /**
* Get real index * Get real index
*/ */
private fun getRealIndex(position: Int) : Int { private fun getRealIndex(position: Int): Int {
val sorted = headersPositions2.toSortedMap()
if (sorted.containsKey(position)) { if (sortedHeaders.containsKey(position)) {
return sorted.keys.indexOf(position) // Header position
//Timber.d("getRealIndex: Header: ${sortedHeaders.keys.indexOf(position)}")
return sortedHeaders.keys.indexOf(position)
} else { } else {
var nbHeadersBefore = 0 // Row position
for (key in sorted.keys) { var headersBefore = 0
if (key < position) { for (key in sortedHeaders.keys) {
nbHeadersBefore++ if (position > key) {
headersBefore++
} else { } else {
break break
} }
} }
return position - nbHeadersBefore //Timber.d("getRealIndex: Row: $position $headersBefore")
return position - headersBefore
} }
} }
/** /**
* Refresh the row in the adapter * Refresh headers positions
*/ */
fun refreshRow(row: RowRepresentable) { fun refreshData() {
/* headersPositions.clear()
if (row.viewType == RowViewType.TITLE_SWITCH.ordinal) { val start = System.currentTimeMillis()
// Avoid to refresh the view because it will refresh itself
// Caution if we want to update the title for example var previousYear = 0
return var previousMonth = 0
}
val calendar = Calendar.getInstance()
val index = this.dataSource.indexForRow(row) for ((index, session) in realmResults.withIndex()) {
if (index >= 0) { calendar.time = session.creationDate
Timber.d("refreshRow: $index") if (calendar.get(Calendar.YEAR) == previousYear && calendar.get(Calendar.MONTH) < previousMonth || (calendar.get(Calendar.YEAR) < previousYear) || index == 0) {
notifyItemChanged(index) headersPositions[index + headersPositions.size] = session.creationDate
previousYear = calendar.get(Calendar.YEAR)
previousMonth = calendar.get(Calendar.MONTH)
}
} }
*/
}
/** sortedHeaders = headersPositions.toSortedMap()
* Update UI
*/
fun updateRows(diffResult: DiffUtil.DiffResult) {
diffResult.dispatchUpdatesTo(this)
}
Timber.d("Create viewTypesPositions in: ${System.currentTimeMillis() - start}ms")
}
} }

@ -4,31 +4,20 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.DiffUtil
import io.realm.RealmResults import io.realm.RealmResults
import io.realm.Sort import io.realm.Sort
import io.realm.kotlin.where import io.realm.kotlin.where
import kotlinx.android.synthetic.main.fragment_history.* import kotlinx.android.synthetic.main.fragment_history.*
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.pokeranalytics.android.R import net.pokeranalytics.android.R
import net.pokeranalytics.android.model.interfaces.Manageable import net.pokeranalytics.android.model.interfaces.Manageable
import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.model.realm.Session
import net.pokeranalytics.android.ui.activity.SessionActivity import net.pokeranalytics.android.ui.activity.SessionActivity
import net.pokeranalytics.android.ui.adapter.HistoryRowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate
import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment
import net.pokeranalytics.android.ui.view.HistorySessionDiffCallback
import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentable
import net.pokeranalytics.android.ui.view.RowViewType
import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager import net.pokeranalytics.android.ui.view.SmoothScrollLinearLayoutManager
import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepresentable
import net.pokeranalytics.android.util.extensions.getMonthAndYear
import net.pokeranalytics.android.util.extensions.isSameDay
import net.pokeranalytics.android.util.extensions.isSameMonth
import net.pokeranalytics.android.util.extensions.longDate
import java.util.* import java.util.*
class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate {
@ -42,7 +31,9 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
} }
} }
private lateinit var historyAdapter: RowRepresentableAdapter private lateinit var historyAdapter: HistoryRowRepresentableAdapter
// Old
//private lateinit var historyAdapter: HistoryRowRepresentableAdapter
private lateinit var realmSessions: RealmResults<Session> private lateinit var realmSessions: RealmResults<Session>
private val sessions: ArrayList<Session> = ArrayList() private val sessions: ArrayList<Session> = ArrayList()
private val rows: ArrayList<RowRepresentable> = ArrayList() private val rows: ArrayList<RowRepresentable> = ArrayList()
@ -65,10 +56,8 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
// Old
//rows.clear() //createSessionsHeaders()
//endedSessions.addAll(getRealm().copyFromRealm(realmSessions))
createSessionsHeaders()
} }
/** /**
@ -95,7 +84,18 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
realmSessions = getRealm().where<Session>().findAll().sort("creationDate", Sort.DESCENDING) realmSessions = getRealm().where<Session>().findAll().sort("creationDate", Sort.DESCENDING)
val viewManager = SmoothScrollLinearLayoutManager(requireContext()) val viewManager = SmoothScrollLinearLayoutManager(requireContext())
historyAdapter = RowRepresentableAdapter(this, this)
realmSessions.addChangeListener { t, changeSet ->
if (changeSet.insertions.isNotEmpty() || changeSet.deletions.isNotEmpty()) {
historyAdapter.refreshData()
}
historyAdapter.notifyDataSetChanged()
}
val months = getRealm().where<Session>().distinct("year", "month").findAll().sort("creationDate", Sort.DESCENDING)
historyAdapter = HistoryRowRepresentableAdapter(realmSessions, this, months)
// Old
//historyAdapter = RowRepresentableAdapter(this, this)
recyclerView.apply { recyclerView.apply {
setHasFixedSize(true) setHasFixedSize(true)
@ -106,9 +106,13 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
/** /**
* Create the endedSessions headers * Create the endedSessions headers
* TODO: Remove
*/ */
private fun createSessionsHeaders() { private fun createSessionsHeaders() {
/*
val start = System.currentTimeMillis()
val oldRows = ArrayList<RowRepresentable>() val oldRows = ArrayList<RowRepresentable>()
oldRows.addAll(rows) oldRows.addAll(rows)
@ -154,10 +158,12 @@ class HistoryFragment : PokerAnalyticsFragment(), LiveRowRepresentableDataSource
newSessionCreated = false newSessionCreated = false
recyclerView.smoothScrollToPosition(0) recyclerView.smoothScrollToPosition(0)
} }
Timber.d("createSessionsHeaders in: ${System.currentTimeMillis() - start}ms")
} }
*/
} }
override fun rowRepresentableForPosition(position: Int): RowRepresentable? { override fun rowRepresentableForPosition(position: Int): RowRepresentable? {
return this.rows[position] return this.rows[position]
} }

Loading…
Cancel
Save