Сделайте BarChart из данных Firebase с помощью mpandroidchart с Kotlin - PullRequest
0 голосов
/ 18 апреля 2020

Не удалось получить данные для создания BarChart из базы данных Firebase в реальном времени. Если я поставлю некоторые статистические данные c, это прекрасно работает. Если я добавлю создание диаграммы в отдельную функцию, она вообще не будет работать, поэтому она переопределяет метод onStart. Что может быть причиной такого поведения кода? Вот мой код. Пожалуйста, помогите.

class ChartsActivity : AppCompatActivity() {
    val ACT = "Charts activity"
    private val mAuth = FirebaseAuth.getInstance()
    private val mDatabase = FirebaseDatabase.getInstance().reference
    private val today = SimpleDateFormat("dd/M/yyyy").format(Date())
    var key : String? =""
    var dbReferenceGoodMark = mDatabase.child ("marks").child("003")
    var dbReferenceNormalMark = mDatabase.child ("marks").child("002")
    var dbReferenceBadMark = mDatabase.child ("marks").child("001")
    val valuesArray = ArrayList<BarEntry>()

    //creating chart for one day
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_charts)
        val userId = mAuth.currentUser!!.uid
            getGood()
        Log.d(ACT, "after good")
            getNormal()
        Log.d(ACT, "after normal")
            getBad()
        Log.d(ACT, "after bad")

    }

    private fun getGood() {
        val findOutGoodID = dbReferenceGoodMark.orderByKey().limitToLast(1)
        findOutGoodID!!.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onCancelled(error: DatabaseError) {
                Log.e(ACT, "onCancelled: ", error.toException())
            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (d: DataSnapshot in dataSnapshot.children) {
                    key = d.key!!
                    Log.d(ACT, "key is " + key)
                }
                getGoodOpinion()
            }
        })
    }
    fun getNormal() {
        val findOutNormalID = dbReferenceNormalMark.orderByKey().limitToLast(1)
        findOutNormalID!!.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onCancelled(error: DatabaseError) {
                Log.e(ACT, "onCancelled: ", error.toException())
            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (d: DataSnapshot in dataSnapshot.children) {
                    key = d.key!!
                    Log.d(ACT, "key is " + key)
                }
                getNormalOpinion()
            }
        })
    }
    fun getBad(){
        val findOutBadID = dbReferenceBadMark.orderByKey().limitToLast(1)
        findOutBadID!!.addListenerForSingleValueEvent(object: ValueEventListener{
            override fun onCancelled(error: DatabaseError) {
                Log.e(ACT, "onCancelled: ", error.toException())
            }
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for(d : DataSnapshot in dataSnapshot.children){
                    key = d.key!!
                    Log.d(ACT, "key is " + key)
                }
              getBadOpinion()
            }
        })

        showToast(this, "Report for " + today)
    }

    fun getGoodOpinion(){
        var dbReferenceGoodMark = mDatabase.child ("marks").child("003")
        var findOutValues = dbReferenceGoodMark.child(key.toString())
        findOutValues.addListenerForSingleValueEvent(object : ValueEventListener{

            override fun onCancelled(error: DatabaseError) {
                Log.e(ACT, "onCancelled: ", error.toException())
            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                var todaysGoodQuantity = dataSnapshot.child("quantity").value.toString()
                addToValuesArray(3.toFloat(), todaysGoodQuantity.toFloat())
                Log.d(ACT, todaysGoodQuantity)
            }

        })
    }

    fun getNormalOpinion(){
        var dbReferenceNormalMark = mDatabase.child ("marks").child("002")
        var findOutValues = dbReferenceNormalMark.child(key.toString())
        findOutValues.addListenerForSingleValueEvent(object : ValueEventListener{

            override fun onCancelled(error: DatabaseError) {
                Log.e(ACT, "onCancelled: ", error.toException())
            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                var todaysNormalQuantity = dataSnapshot.child("quantity").value.toString()
                addToValuesArray(2.toFloat(), todaysNormalQuantity.toFloat())
                Log.d(ACT, todaysNormalQuantity)
            }

        })
    }

    fun getBadOpinion(){
        var dbReferenceBadMark = mDatabase.child ("marks").child("003")
        var findOutValues = dbReferenceBadMark.child(key.toString())
        findOutValues.addListenerForSingleValueEvent(object : ValueEventListener{

            override fun onCancelled(error: DatabaseError) {
                Log.e(ACT, "onCancelled: ", error.toException())
            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                var todaysBadQuantity = dataSnapshot.child("quantity").value.toString()
                addToValuesArray(1.toFloat(), todaysBadQuantity.toFloat())
                Log.d(ACT, todaysBadQuantity)
            }

        })
    }

    fun addToValuesArray(markNumber:Float, markValue:Float){
        valuesArray.add(BarEntry(markNumber, markValue.toFloat()))
    }


override fun onStart(){
    super.onStart()
    if (mAuth.currentUser==null){
        startActivity(Intent(this, LoginActivity::class.java))
        finish()
    }
    Log.d(ACT, valuesArray.size.toString())
    val size = valuesArray.size
    val set1: BarDataSet
    set1 = BarDataSet(valuesArray, "Ussat kitchen marks for " + today)
    set1.setColors(*ColorTemplate.LIBERTY_COLORS)
    val dataSets = ArrayList<IBarDataSet>()
    dataSets.add(set1)
    val data = BarData(dataSets)
    data.setValueTextSize(10f)
    data.barWidth = 0.9f
    chart.animateY(5000)
    chart.setTouchEnabled(false)
    chart.data = data
}
}
...