【发布时间】:2022-06-25 21:21:42
【问题描述】:
- 我正在尝试从 Firestore db 访问数据并将其显示到 MPAndroidChart 中。
- 图表应显示与
parties数组匹配的本周数据。我不确定我是否可以从 Measurement 课程中访问weekdata。 - Measurement 类使用
kotlin-parcelize插件。
This is how data are stored in Firestore
这是我的代码:
@file:Suppress("DEPRECATION", "UNREACHABLE_CODE")
class HomeFragment : BaseFragment() {
private val pieChart: PieChart? = null
val parties =
arrayOf("Before Activity", "After Activity", "Before Treatment", "After Treatment")
private val mFirestore = FirebaseFirestore.getInstance()
fun getCurrentUserID(): String {
val currentUser = FirebaseAuth.getInstance().currentUser
var currentUserID = ""
if (currentUser != null) {
currentUserID = currentUser.uid
}
return currentUserID
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val root = inflater.inflate(R.layout.fragment_home, container, false)
return root
}
@SuppressLint("SimpleDateFormat")
private fun displayPieChart () {
val pieChart = view?.findViewById<PieChart>(pie_chart)
pieChart?.setUsePercentValues(true)
pieChart?.description?.isEnabled = false
pieChart?.setExtraOffsets(5f, 10f, 5f, 5f)
pieChart?.dragDecelerationFrictionCoef = 0.95f
pieChart?.centerText = "Weekly Pulse Analysis"
pieChart?.isDrawHoleEnabled = true
pieChart?.setHoleColor(Color.WHITE)
pieChart?.setTransparentCircleColor(Color.WHITE)
pieChart?.setTransparentCircleAlpha(110)
pieChart?.holeRadius = 56f
pieChart?.transparentCircleRadius = 61f
pieChart?.setDrawCenterText(true)
pieChart?.rotationAngle = 0f
pieChart?.isRotationEnabled = true
pieChart?.isHighlightPerTapEnabled = true
pieChart?.animateY(1400, Easing.EaseInOutQuad)
val l: Legend = pieChart!!.legend
l.verticalAlignment = Legend.LegendVerticalAlignment.TOP
l.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT
l.orientation = Legend.LegendOrientation.VERTICAL
l.setDrawInside(false)
l.xEntrySpace = 7f
l.textColor = Color.BLACK
l.yEntrySpace = 0f
l.yOffset = 0f
pieChart.setEntryLabelColor(Color.WHITE)
pieChart.setEntryLabelTextSize(12f)
mFirestore.collection(Constants.MEASUREMENTS)
.whereEqualTo(Constants.USER_ID, getCurrentUserID())
.get()
.addOnSuccessListener { queryDocumentSnapshots ->
val userdata : ArrayList<Measurements> = ArrayList()
val weekdata = ArrayList<Measurements>()
if (!queryDocumentSnapshots.isEmpty) {
for (journals in queryDocumentSnapshots) {
val displayData: Measurements = journals.toObject(Measurements::class.java)
userdata.add(displayData)
Log.d("Data for chart", displayData.activity)
}
if (userdata.size > 0) {
val dateStringArray = ArrayList<String>()
val c = Calendar.getInstance()
c[Calendar.DAY_OF_WEEK] = Calendar.SUNDAY
val df: DateFormat = SimpleDateFormat("MMM dd yyyy")
for (i in 0..6) {
dateStringArray.add(df.format(c.time))
c.add(Calendar.DATE, 1)
Log.d("Data ", dateStringArray.toString())
}
for (i in userdata.indices) {
if (dateStringArray[0].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
if (dateStringArray[1].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
if (dateStringArray[2].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
if (dateStringArray[3].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
if (dateStringArray[4].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
if (dateStringArray[5].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
if (dateStringArray[6].equals(
userdata[i].date,
ignoreCase = true
)
) {
weekdata.add(userdata[i])
}
}
if (weekdata.size > 0) {
generateChart(weekdata)
}
}
pieChart.visibility = View.VISIBLE
}
}
.addOnFailureListener { e ->
pieChart.visibility = View.VISIBLE
Log.e(
activity?.javaClass?.simpleName,
"Error getting chart data.",
e
)}
}
@SuppressLint("UseCompatLoadingForDrawables")
fun generateChart(weekdata: ArrayList<Measurements>) {
var beforeactivitycount = 0
var afteractivitycount = 0
var beforetratamentcount = 0
var aftertratamentcount = 0
var beforeactivitytotal = 0.0f
var afteractivitytotal = 0.0f
var beforetratamenttotal = 0.0f
var aftertratamenttotal = 0.0f
var beforeactivityval = 0.0f
var afteractivityval = 0.0f
var beforetratamentval = 0.0f
var aftertratamentval = 0.0f
for (i in weekdata.indices) {
val displayData: Measurements = weekdata[i]
Log.d("Data activity", displayData.activity)
if (displayData.activity.equals("Out of Bed", ignoreCase = true)
|| displayData.activity.equals("After Breakfast", ignoreCase = true)
|| displayData.activity.equals("Before lunch", ignoreCase = true)
|| displayData.activity.equals("Before gym", ignoreCase = true)
) {
beforeactivitycount++
beforeactivitytotal += displayData.pulse.toFloat()
}
if (displayData.activity.equals("Before Bed", ignoreCase = true)
|| displayData.activity.equals("After Breakfast", ignoreCase = true)
|| displayData.activity.equals("After lunch", ignoreCase = true)
|| displayData.activity.equals("After gym", ignoreCase = true)
) {
afteractivitycount++
afteractivitytotal += displayData.pulse.toFloat()
}
if (displayData.activity.equals("Before Treatment", ignoreCase = true)) {
beforetratamentcount++
beforetratamenttotal += displayData.pulse.toFloat()
}
if (displayData.activity.equals("After Treatment", ignoreCase = true)) {
aftertratamentcount++
aftertratamenttotal += displayData.pulse.toFloat()
}
}
beforeactivityval = beforeactivitytotal / beforeactivitycount
afteractivityval = afteractivitytotal / afteractivitycount
beforetratamentval = beforetratamenttotal / beforetratamentcount
aftertratamentval = aftertratamenttotal / aftertratamentcount
val entries = ArrayList<PieEntry>()
entries.add(
PieEntry(
beforeactivityval,
parties[0],
//resources.getDrawable(R.drawable.ic_star_24)
)
)
entries.add(
PieEntry(
afteractivityval,
parties[1],
//resources.getDrawable(R.drawable.ic_star_24)
)
)
entries.add(
PieEntry(
beforetratamentval,
parties[2],
//resources.getDrawable(R.drawable.ic_star_24)
)
)
entries.add(
PieEntry(
aftertratamentval,
parties[3],
//resources.getDrawable(R.drawable.ic_star_24)
)
)
val dataSet = PieDataSet(entries, "")
dataSet.setDrawIcons(false)
dataSet.sliceSpace = 3f
dataSet.iconsOffset = MPPointF(0f, 40f)
dataSet.selectionShift = 5f
val colors = ArrayList<Int>()
colors.add(Color.parseColor("#40C9C0"))
colors.add(Color.parseColor("#0699EF"))
colors.add(Color.parseColor("#007DB8"))
colors.add(Color.parseColor("#003452"))
dataSet.colors = colors
val data = PieData(dataSet)
data.setValueFormatter(PercentFormatter())
data.setValueTextSize(11f)
data.setValueTextColor(Color.WHITE)
pieChart?.setNoDataTextColor(Color.RED)
pieChart?.setData(data)
pieChart?.highlightValues(null)
pieChart?.setUsePercentValues(false)
pieChart?.invalidate()
(pieChart?.getRenderer() as PieChartRenderer).paintEntryLabels.color = Color.WHITE
(pieChart!!.renderer as PieChartRenderer).paintEntryLabels.textSize = 35f
}
override fun onDestroyView() {
super.onDestroyView()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.dashboard_menu, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onResume() {
super.onResume()
displayPieChart()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val id = item.itemId
when(id) {
R.id.action_settings -> {
startActivity(Intent(activity, SettingsActivity::class.java))
return true
}
}
return super.onOptionsItemSelected(item)
}
}
这是我的 *.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorOffWhite"
tools:context=".ui.fragments.HomeFragment">
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/pie_chart"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
我是 Kotlin 的新手。
【问题讨论】:
-
你在这里有几个不同的东西,不清楚你在问什么部分。如果您询问如何从 Firestore 获取数据,请关注该部分并忽略所有图表详细信息。如果您询问如何在图表上绘制给定的数据数组,则删除所有 firebase 详细信息并显示一个带有预定义输入数组的简单示例,并描述您遇到问题/想要做什么。
标签: android firebase kotlin mpandroidchart