@@ -11,10 +11,14 @@ import android.widget.TextView
1111import com.blogspot.e_kanivets.moneytracker.MtApp
1212import com.blogspot.e_kanivets.moneytracker.R
1313import com.blogspot.e_kanivets.moneytracker.controller.FormatController
14- import com.blogspot.e_kanivets.moneytracker.entity.data.Record
14+ import com.blogspot.e_kanivets.moneytracker.entity.RecordAdapterData
15+ import com.blogspot.e_kanivets.moneytracker.entity.HeaderItem
16+ import com.blogspot.e_kanivets.moneytracker.entity.RecordItem
1517import com.blogspot.e_kanivets.moneytracker.report.record.IRecordReport
1618import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter
19+ import kotlinx.android.synthetic.main.view_header_date.view.*
1720import kotlinx.android.synthetic.main.view_record.view.*
21+ import kotlinx.android.synthetic.main.view_record.view.container
1822import kotlinx.android.synthetic.main.view_summary_records.view.*
1923import javax.inject.Inject
2024
@@ -30,16 +34,16 @@ class RecordAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {
3034 private var red: Int
3135 private var green: Int
3236
33- private var records : List <Record >
37+ private var items : List <RecordAdapterData >
3438 private var context: Context
3539
3640 private var summaryPresenter: ShortSummaryPresenter
37- private var isHeaderViewNeeded : Boolean = false
38- private var headerViewHolder : HeaderViewHolder
41+ private var isSummaryViewNeeded : Boolean = false
42+ private var summaryViewHolder : SummaryViewHolder
3943
40- constructor (context: Context , records : List <Record >, isHeaderViewNeeded : Boolean , itemClickListener: ((Int ) -> Unit )? ) {
44+ constructor (context: Context , items : List <RecordAdapterData >, isSummaryViewNeeded : Boolean , itemClickListener: ((Int ) -> Unit )? ) {
4145 this .context = context
42- this .records = records
46+ this .items = items
4347
4448 MtApp .get().appComponent.inject(this )
4549
@@ -51,68 +55,71 @@ class RecordAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {
5155 summaryPresenter = ShortSummaryPresenter (context)
5256
5357 this .itemClickListener = itemClickListener
54- this .isHeaderViewNeeded = isHeaderViewNeeded
58+ this .isSummaryViewNeeded = isSummaryViewNeeded
5559
56- headerViewHolder = HeaderViewHolder (LayoutInflater .from(context).inflate(R .layout.view_summary_records, null ), itemClickListener)
57- summaryPresenter.create(true , headerViewHolder )
60+ summaryViewHolder = SummaryViewHolder (LayoutInflater .from(context).inflate(R .layout.view_summary_records, null ), itemClickListener)
61+ summaryPresenter.create(true , summaryViewHolder )
5862 }
5963
60- override fun getItemCount () = records .size + if (isHeaderViewNeeded ) 1 else 0
64+ override fun getItemCount () = items .size + if (isSummaryViewNeeded ) 1 else 0
6165
62- override fun getItemViewType (position : Int ): Int = if (position == 0 && isHeaderViewNeeded) {
66+ override fun getItemViewType (position : Int ): Int = if (position == 0 && isSummaryViewNeeded) {
67+ TYPE_SUMMARY
68+ } else if (items[position - if (isSummaryViewNeeded) 1 else 0 ] is HeaderItem ) {
6369 TYPE_HEADER
6470 } else {
65- TYPE_ITEM
71+ TYPE_RECORD
6672 }
6773
6874 override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ): RecyclerView .ViewHolder =
69- if (viewType == TYPE_HEADER ) {
70- headerViewHolder
71- } else {
72- ViewHolder ( LayoutInflater .from(context).inflate( R .layout.view_record, parent, false ), itemClickListener)
75+ when (viewType) {
76+ TYPE_RECORD -> RecordViewHolder ( LayoutInflater .from(context).inflate( R .layout.view_record, parent, false ), itemClickListener)
77+ TYPE_HEADER -> HeaderViewHolder ( LayoutInflater .from(context).inflate( R .layout.view_header_date, parent, false ))
78+ else -> summaryViewHolder
7379 }
7480
7581 override fun onBindViewHolder (rvViewHolder : RecyclerView .ViewHolder , position : Int ) {
76- if (position == 0 && isHeaderViewNeeded ) {
82+ if (position == 0 && isSummaryViewNeeded ) {
7783 // adapter already bound to view
7884 return
7985 }
8086
81- val viewHolder = rvViewHolder as ViewHolder
82- val record: Record = records[position - if (isHeaderViewNeeded) 1 else 0 ]
83- viewHolder.container.setBackgroundColor(if (record.isIncome) whiteGreen else whiteRed)
84- viewHolder.tvPrice.setTextColor(if (record.isIncome) green else red)
85-
86- viewHolder.tvDateAndTime.text = formatController.formatDateAndTime(record.time)
87- val price = (if (record.isIncome) record.fullPrice else getNegative(record.fullPrice))
88- viewHolder.tvPrice.text = formatController.formatSignedAmount(price)
89- viewHolder.tvTitle.text = record.title
90- viewHolder.tvCategory.text = record.category?.name
91- viewHolder.tvCurrency.text = record.currency
87+ if (rvViewHolder is RecordViewHolder ) {
88+ val record = items[position - if (isSummaryViewNeeded) 1 else 0 ] as RecordItem
89+ rvViewHolder.tvPrice.setTextColor(if (record.isIncome) green else red)
90+
91+ val price = (if (record.isIncome) record.fullPrice else getNegative(record.fullPrice))
92+ rvViewHolder.tvPrice.text = formatController.formatSignedAmount(price)
93+ rvViewHolder.tvTitle.text = record.title
94+ rvViewHolder.tvCategory.text = record.categoryName
95+ rvViewHolder.tvCurrency.text = record.currency
96+ } else {
97+ val headerViewHolder = rvViewHolder as HeaderViewHolder
98+ val header = items[position - if (isSummaryViewNeeded) 1 else 0 ] as HeaderItem
99+ headerViewHolder.tvDate.text = header.date
100+ }
92101 }
93102
94103 private fun getNegative (number : Double ): Double {
95104 return - 1 * number
96105 }
97106
98- fun setRecords (recordsList : List <Record >, report : IRecordReport ? , currency : String , ratesNeeded : List <String >) {
99- records = recordsList
107+ fun setRecords (itemsList : List <RecordAdapterData >, report : IRecordReport ? , currency : String , ratesNeeded : List <String >) {
108+ items = itemsList
100109 summaryPresenter.update(report, currency, ratesNeeded)
101110 notifyDataSetChanged()
102111 }
103112
104- class ViewHolder : RecyclerView .ViewHolder {
113+ class RecordViewHolder : RecyclerView .ViewHolder {
105114
106115 var container: LinearLayout
107- var tvDateAndTime: TextView
108116 var tvPrice: TextView
109117 var tvTitle: TextView
110118 var tvCategory: TextView
111119 var tvCurrency: TextView
112120
113121 constructor (view: View , itemClickListener: ((Int ) -> Unit )? ) : super (view) {
114122 container = view.container
115- tvDateAndTime = view.tvDateAndTime
116123 tvPrice = view.tvPrice
117124 tvTitle = view.tvTitle
118125 tvCategory = view.tvCategory
@@ -124,7 +131,11 @@ class RecordAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {
124131 }
125132 }
126133
127- class HeaderViewHolder : RecyclerView .ViewHolder , ShortSummaryPresenter .SummaryViewInterface {
134+ class HeaderViewHolder (view : View ) : RecyclerView.ViewHolder(view) {
135+ val tvDate: TextView = view.tvDate
136+ }
137+
138+ class SummaryViewHolder : RecyclerView .ViewHolder , ShortSummaryPresenter .SummaryViewInterface {
128139
129140 private var tvPeriod: TextView
130141 private var tvTotalIncome: TextView
@@ -145,15 +156,15 @@ class RecordAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {
145156 tvTotalExpense = view.tvTotalExpense
146157 tvTotal = view.tvTotal
147158
148- view.setOnClickListener {
159+ view.cvSummary. setOnClickListener {
149160 itemClickListener?.invoke(0 )
150161 }
151162 }
152163 }
153164
154165 companion object {
155-
156- private const val TYPE_HEADER = 0
157- private const val TYPE_ITEM = 1
166+ private const val TYPE_SUMMARY = 0
167+ private const val TYPE_HEADER = 1
168+ private const val TYPE_RECORD = 2
158169 }
159170}
0 commit comments