|
|
|
|
@ -1,11 +1,13 @@ |
|
|
|
|
package net.pokeranalytics.android.ui.adapter.components |
|
|
|
|
|
|
|
|
|
import android.content.Context |
|
|
|
|
import android.view.View |
|
|
|
|
import android.view.ViewGroup |
|
|
|
|
import androidx.recyclerview.widget.RecyclerView |
|
|
|
|
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.SimpleRow |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* An interface used to provide RowRepresentableAdapter content and value in the form of rows |
|
|
|
|
@ -15,7 +17,21 @@ interface RowRepresentableDataSource { |
|
|
|
|
/** |
|
|
|
|
* Returns a list of rows |
|
|
|
|
*/ |
|
|
|
|
fun adapterRows(): ArrayList<RowRepresentable> |
|
|
|
|
val adapterRows: ArrayList<RowRepresentable>? |
|
|
|
|
get() { |
|
|
|
|
return null |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun dataForPosition(position: Int): RowRepresentableDataSource? { |
|
|
|
|
return null |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun size(): Int { |
|
|
|
|
this.adapterRows?.let { |
|
|
|
|
return it.size |
|
|
|
|
} |
|
|
|
|
return 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Returns a boolean for a specific row |
|
|
|
|
@ -55,6 +71,7 @@ interface RowRepresentableDataSource { |
|
|
|
|
interface RowRepresentableDelegate { |
|
|
|
|
fun onRowSelected(row: RowRepresentable) {} |
|
|
|
|
fun onActionSelected(row: RowRepresentable) {} |
|
|
|
|
fun dataSelected(data: RowRepresentableDataSource) {} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -62,52 +79,59 @@ interface RowRepresentableDelegate { |
|
|
|
|
* @param rowRepresentableDataSource the datasource providing rows |
|
|
|
|
* @param rowRepresentableDelegate the delegate, notified of UI actions |
|
|
|
|
*/ |
|
|
|
|
class RowRepresentableAdapter(var rowRepresentableDataSource: RowRepresentableDataSource, var rowRepresentableDelegate: RowRepresentableDelegate? = null) : |
|
|
|
|
class RowRepresentableAdapter(var rowRepresentableDataSource: RowRepresentableDataSource, var rowRepresentableDelegate: RowRepresentableDelegate? = null, var layout: Int? = null) : |
|
|
|
|
RecyclerView.Adapter<RecyclerView.ViewHolder>() { |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* The list of rows to display |
|
|
|
|
*/ |
|
|
|
|
private var rows: ArrayList<RowRepresentable> = ArrayList() |
|
|
|
|
|
|
|
|
|
init { |
|
|
|
|
this.rows = rowRepresentableDataSource.adapterRows() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun getItemViewType(position: Int): Int { |
|
|
|
|
return this.rows[position].viewType |
|
|
|
|
this.rowRepresentableDataSource.adapterRows?.let { |
|
|
|
|
return it[position].viewType |
|
|
|
|
} ?: run { |
|
|
|
|
return RowViewType.DATA.ordinal |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { |
|
|
|
|
val rowViewType: RowViewType = RowViewType.values()[viewType] |
|
|
|
|
return rowViewType.viewHolder(parent) |
|
|
|
|
return rowViewType.viewHolder(parent, layout) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun getItemCount(): Int { |
|
|
|
|
return this.rows.size |
|
|
|
|
return this.rowRepresentableDataSource.size() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { |
|
|
|
|
val dynamicRow = this.rows[position] |
|
|
|
|
|
|
|
|
|
val listener = View.OnClickListener { |
|
|
|
|
rowRepresentableDelegate?.onRowSelected(dynamicRow) |
|
|
|
|
this.rowRepresentableDataSource.adapterRows?.let {rows -> |
|
|
|
|
val listener = View.OnClickListener { |
|
|
|
|
rowRepresentableDelegate?.onRowSelected(rows[position]) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val actionListener = View.OnClickListener { |
|
|
|
|
rowRepresentableDelegate?.onActionSelected(rows[position]) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
(holder as BindableHolder).bind(rows[position], this.rowRepresentableDataSource, listener, actionListener) |
|
|
|
|
} ?: run { |
|
|
|
|
this.rowRepresentableDataSource.dataForPosition(position)?.let { dataSource -> |
|
|
|
|
val listener = View.OnClickListener { |
|
|
|
|
rowRepresentableDelegate?.dataSelected(dataSource) |
|
|
|
|
} |
|
|
|
|
(holder as BindableHolder).bind(SimpleRow.NAME, dataSource, listener, null) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val actionListener = View.OnClickListener { |
|
|
|
|
rowRepresentableDelegate?.onActionSelected(dynamicRow) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
(holder as BindableHolder).bind(dynamicRow, this.rowRepresentableDataSource, listener, actionListener) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Refresh the row in the adapter |
|
|
|
|
*/ |
|
|
|
|
fun refreshRow(row: RowRepresentable) { |
|
|
|
|
val index = rows.indexOf(row) |
|
|
|
|
if (index >= 0) { |
|
|
|
|
notifyItemChanged(index) |
|
|
|
|
this.rowRepresentableDataSource.adapterRows?.let {rows -> |
|
|
|
|
val index = rows.indexOf(row) |
|
|
|
|
if (index >= 0) { |
|
|
|
|
notifyItemChanged(index) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -115,7 +139,6 @@ class RowRepresentableAdapter(var rowRepresentableDataSource: RowRepresentableDa |
|
|
|
|
* Refresh all adapter rows |
|
|
|
|
*/ |
|
|
|
|
fun refreshAllRows() { |
|
|
|
|
this.rows = rowRepresentableDataSource.adapterRows() |
|
|
|
|
notifyDataSetChanged() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|