【问题标题】:I'm trying to display data from Firestore into a MPAndroidChart我正在尝试将 Firestore 中的数据显示到 MPAndroidChart
【发布时间】:2022-06-25 21:21:42
【问题描述】:
  1. 我正在尝试从 Firestore db 访问数据并将其显示到 MPAndroidChart 中。
  2. 图表应显示与parties 数组匹配的本周数据。我不确定我是否可以从 Measurement 课程中访问 weekdata
  3. 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


【解决方案1】:

明白了,所以我在 BarChart 上显示了原始数据。现在,我想做的是更改数据库中值的原始数据。 以下是代码的外观:

 override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        val view =
            inflater.inflate(com.bloodpressurejournal.R.layout.fragment_charts, container, false)

        // val font = Typeface.createFromAsset(this.activity!!.assets, "fonts/ProductSans.ttf")

        val bar = view?.findViewById<BarChart>(com.bloodpressurejournal.R.id.line_chart)

        val entries: MutableList<BarEntry> = ArrayList()
        entries.add(BarEntry(0f, 100f, "Before Activity"))
        entries.add(BarEntry(1f, 82f, "After Activity"))
        entries.add(BarEntry(2f, 95f, "Before Treatment"))
        entries.add(BarEntry(3f, 69f, "After Treatment"))


        val bSet = BarDataSet(entries, "Marks")
        bSet.setColors(*ColorTemplate.VORDIPLOM_COLORS)

        val barFactors: ArrayList<String> = ArrayList()
        barFactors.add("Before Activity")
        barFactors.add("After Activity")
        barFactors.add("Before Treatment")
        barFactors.add("After Treatment")


        val xAxis: XAxis? = bar?.getXAxis()
        xAxis?.granularity = 1f
        xAxis?.isGranularityEnabled = true
        val data = BarData(bSet)
        data.barWidth = 0.9f // set custom bar width

        data.setValueTextSize(12f)
        val description = Description()
        // description.setTextColor(R.color.colorPrimary)
        description.setText("All values in marks")
        bar?.setDescription(description)
        bar?.setData(data)
        bar?.setFitBars(true) // make the x-axis fit exactly all bars

        bar?.invalidate() // refresh

        bar?.getXAxis()!!.setValueFormatter(IndexAxisValueFormatter(barFactors))

        val l: Legend = bar!!.getLegend()
        l.formSize = 10f // set the size of the legend forms/shapes

        l.form = Legend.LegendForm.CIRCLE // set what type of form/shape should be used

        // l.typeface = font
        l.textSize = 12f
        l.textColor = Color.BLACK
        val lentries: MutableList<LegendEntry> = ArrayList()
        for (i in 0 until barFactors.size) {
            val entry = LegendEntry()
            entry.formColor = ColorTemplate.VORDIPLOM_COLORS[i]
            entry.label = barFactors[i]
            lentries.add(entry)
        }
        l.xEntrySpace = 5f // set the space between the legend entries on the x-axis

        l.yEntrySpace = 5f
        l.setCustom(lentries)

        return view;
}

现在,如何调用集合将数据添加到 BarChart?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 2021-08-02
    • 2018-04-21
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多