Как вставить значение даты в ось X mpandroidchart с помощью kotlin - PullRequest
1 голос
/ 16 мая 2019

Мне нужно вставить значение даты в мою ось X, но ось X принимает только значение с плавающей запятой, но когда я пытаюсь отформатировать мою дату в метку времени, затем конвертировать в плавающую дату, но она по-прежнему не принимает значение.,

Ниже приведен мой фрагмент кода.

    private fun loadDate(){
        mLineChart = findViewById(R.id.chart)
        dataList = ArrayList()
        val stringRequest = StringRequest(
            Request.Method.GET, URL,
            Listener { response ->
                Log.d("JSONResult", response.toString())
                try {
                    //converting the string to json array object
                    var array = JSONArray(response)

                    //traversing through all the object
                    for (i in 0 until array.length()) {

                        var stationData = array.getJSONObject(i)
                        //adding the product to product list
                        dataList.add(Data(
                            stationData.getString("id"),
                            stationData.getString("station_name"),
                            stationData.getString("date_time"),
                            stationData.getString("pm25_10min_avg")
                        ))
                    }

                    var i = 0
                    val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
                    for (data in dataList) {
                        if (data.name == navBarTitle) {
                            val date = df.parse(data.date)
                            val pm = java.lang.Float.parseFloat(data.pm)
                            entries.add(Entry(date.time.toFloat(), water))
                        }
                    }

                    val set1 = LineDataSet(entries, "pm25_10min_avg")
                    set1.fillAlpha = 110

                    var dataSet = java.util.ArrayList<ILineDataSet>()
                    dataSet.add(set1)

                    val lineData = LineData(dataSet)
                    mLineChart.data = lineData

                    set1.color = Color.RED
                    set1.mode = LineDataSet.Mode.HORIZONTAL_BEZIER
                    set1.setCircleColor(Color.RED)
                    set1.setDrawCircleHole(false)
                    set1.setDrawValues(false)
                    mLineChart.description.text = ""
                    mLineChart.invalidate()
                    mLineChart.axisRight.isEnabled = false
                    mLineChart.axisLeft.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
                    mLineChart.axisRight.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)

                    val legend = mLineChart.legend
                    legend.isEnabled = true
                    legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP
                    legend.horizontalAlignment = Legend.LegendHorizontalAlignment.LEFT
                    legend.orientation = Legend.LegendOrientation.HORIZONTAL
                    legend.textSize = 15f

                    val xAxis = mLineChart.xAxis
                    xAxis.position = XAxis.XAxisPosition.BOTTOM
                    xAxis.setDrawGridLines(false)
                    xAxis.labelCount = 6
                    xAxis.granularity = 1F
                    xAxis.isGranularityEnabled = true


                    val dateFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH)
                    val sdf = SimpleDateFormat("HH:mm", Locale.ENGLISH)
                    for (data in dataList) {
                        if (data.name == navBarTitle) {
                            val date = dateFormatter.parse(data.date)
                            val time = sdf.format(date)
                            formatedXVal.add(time)
                        }
                    }

                    xAxis.valueFormatter = IndexAxisValueFormatter(formatedXVal)

                    val mv = MyMarkerView(this, R.layout.markerview)
                    mv.chartView = chart // For bounds control
                    chart!!.marker = mv

                } catch (e: NullPointerException) {
                    e.printStackTrace()

                } catch (e: JSONException) {
                    e.printStackTrace()
                }
            },
            Response.ErrorListener { error ->
                error.printStackTrace()
                Toast.makeText(this@AqiAnalysisActivity, error.message, Toast.LENGTH_LONG).show()})
        Volley.newRequestQueue(this).add(stringRequest)
    }

1 Ответ

0 голосов
/ 16 мая 2019

Для Java:

Добавьте свои XAxis метки в ArrayList

Используйте следующий код для отображения даты.

    final ArrayList<String> xLabel = new ArrayList<>();
    Calendar calendar = Calendar.getInstance();
    DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");

    for(int i=0;i<=50;i++){
        calendar.add(Calendar.DAY_OF_YEAR, i);
        Date date= calendar.getTime();
        String txtDate= dateFormat.format(date);

        xLabel.add(txtDate);
    }

    // or use some other logic to save your data in list. For ex. 
    for(i=1; i<50; i+=2)
    { 
       xLabel.add(""+3*i);
    }

затем используйте эту метку в setValueFormatter.

    XAxis xAxis = mChart.getXAxis();
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    xAxis.setDrawGridLines(false);
    xAxis.setValueFormatter(new IAxisValueFormatter() {
       @Override
       public String getFormattedValue(float value, AxisBase axis) {
           return xLabel.get((int)value);
       }
   });

Для Kotlin:

val xLabel = ArrayList<String>()
   val calendar = Calendar.getInstance()
   val dateFormat = SimpleDateFormat("dd-MMM-yyyy")

   for (i in 0..50) {
       calendar.add(Calendar.DAY_OF_YEAR, i)
       val date = calendar.time
       val txtDate = dateFormat.format(date)

       xLabel.add(txtDate)
   }

   // or use some other logic to save your data in list. For ex.
   var i = 1
   while (i < 50) {
        xLabel.add("" + 3 * i)
        i += 2
   }

, затем используйте этометка в setValueFormatter.

   val xAxis = mChart.xAxis
   xAxis.position = XAxis.XAxisPosition.BOTTOM
   xAxis.setDrawGridLines(false)
   xAxis.valueFormatter = IAxisValueFormatter { value, axis -> xLabel[value.toInt()] }
...