xАсис в миллисекундах до ЧЧ: формат мм в MPAndroidChart с использованием kotlin - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю программу, которая будет отображать данные в виде линейного графика в соответствии с временной шкалой в формате «ЧЧ: мм», но мой код не отформатировал мой xAsis

Я пытаюсь по-разномуотформатировать, но он не работает, как коды ниже.

    xAxis.valueFormatter = IAxisValueFormatter { value, _-> SimpleDateFormat("HH:mm", Locale.ENGLISH).format(value.toLong()) } as ValueFormatter

, а также этот.

    xAxis.valueFormatter = formatter

    var formatter: ValueFormatter  = object : ValueFormatter() {

                    // we don't draw numbers, so no decimal digits needed
                    var sdf = SimpleDateFormat("HH:mm", Locale.ENGLISH)

                    override fun getFormattedValue(value: Float, axis: AxisBase): String {
                        return sdf.format(value)
                    }
                }

мой фактический результат должен быть в формате ЧЧ: мм

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

    class MainActivity : AppCompatActivity() {
private lateinit var mLineChart: LineChart
private var entries = java.util.ArrayList<Entry>()

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    mLineChart = findViewById(R.id.chart)

    entries.add(Entry(0f, 5f))
    entries.add(Entry(1f, 10f))
    entries.add(Entry(2f, 15f))
    entries.add(Entry(3f, 20f))
    entries.add(Entry(4f, 5f))
    entries.add(Entry(5f, 10f))

    val set1 = LineDataSet(entries, "Water")
    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.CUBIC_BEZIER
    mLineChart.description.text = ""
    mLineChart.legend.isEnabled = false
    mLineChart.invalidate()
    mLineChart.axisRight.isEnabled = false
    mLineChart.axisLeft.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
    mLineChart.axisRight.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)


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

    val xValsDateLabel = ArrayList<String>()

    val xValsOriginalMillis = ArrayList<Long>()
    xValsOriginalMillis.add(1554875423736L)
    xValsOriginalMillis.add(1555275494836L)
    xValsOriginalMillis.add(1585578525900L)
    xValsOriginalMillis.add(1596679626245L)
    xValsOriginalMillis.add(1609990727820L)
    xValsOriginalMillis.add(1709990727820L)

    for (i in xValsOriginalMillis) {
        val mm = i / 60 % 60
        val hh = i / (60 * 60) % 24
        val mDateTime = "$hh:$mm"
        xValsDateLabel.add(mDateTime)
    }

    xAxis.valueFormatter = IAxisValueFormatter { value, axis ->
        if (xValsDateLabel != null && value.toInt() >= 0
            && value.toInt() <= xValsDateLabel!!.size - 1) {
            xValsDateLabel!![value.toInt()].toString()
        } else {
            ("").toString()
        }
    } as ValueFormatter
} }

Ниже приведен обновленный фрагмент кода моего манифеста

    <?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

нижеошибка трассировки полного стека

    2019-04-10 15:34:05.458 27746-27746/com.example.graph E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.graph, PID: 27746
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.graph/com.example.graph.MainActivity}: java.lang.ClassCastException: com.example.graph.MainActivity$onCreate$1 cannot be cast to com.github.mikephil.charting.formatter.ValueFormatter
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:169)
    at android.app.ActivityThread.main(ActivityThread.java:6521)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.lang.ClassCastException: com.example.graph.MainActivity$onCreate$1 cannot be cast to com.github.mikephil.charting.formatter.ValueFormatter
    at com.example.graph.MainActivity.onCreate(MainActivity.kt:79)
    at android.app.Activity.performCreate(Activity.java:7051)
    at android.app.Activity.performCreate(Activity.java:7042)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:169) 
    at android.app.ActivityThread.main(ActivityThread.java:6521) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

1 Ответ

0 голосов
/ 10 апреля 2019

Чтобы отобразить значения в формате даты / времени в xAxis в MpAndroidChart, выполните следующие действия:

Сначала возьмите строковый массив, названный «xValsDateLabel», как показано ниже:

val xValsDateLabel = ArrayList<String>()

Теперь Для примера у меня есть 5 значений, которые будут напечатаны на оси x в формате даты или времени, а затем сначала примите эти значения в миллисекундах в одном массиве, как показано ниже:

val xValsOriginalMillis = ArrayList<Long>()
xValsOriginalMillis.add(1554875423736L)
xValsOriginalMillis.add(1555275494836L)
xValsOriginalMillis.add(1585578525900L)
xValsOriginalMillis.add(1596679626245L)
xValsOriginalMillis.add(1609990727820L)

Теперь выполните цикл с «xValsOriginalMillis», а затем поместите значения как ЧЧ: мм в «Строка массива« xValsDateLabel », преобразовав миллисекунды в ЧЧ: мм, как показано ниже:

for (i in xValsOriginalMillis.indices) {
            val mm = xValsOriginalMillis[i] / 60 % 60
            val hh = xValsOriginalMillis[i] / (60 * 60) % 24
            val mDateTime = "$hh:$mm"
            xValsDateLabel.add(mDateTime)
        }

Теперь отформатируйте значения xAxis, как показано ниже:

class MyValueFormatter(private val xValsDateLabel: ArrayList<String>) : ValueFormatter() {

        override fun getFormattedValue(value: Float): String {
            return value.toString()
        }

        override fun getAxisLabel(value: Float, axis: AxisBase): String {
            if (value.toInt() >= 0 && value.toInt() <= xValsDateLabel.size - 1) {
                return xValsDateLabel[value.toInt()]
            } else {
                return ("").toString()
            }
        }
    }

И используйте это средство форматирования значения с нижней строкой:

xAxis.valueFormatter = (MyValueFormatter(xValsDateLabel))

Привет, я отредактировал свой ответ, как показано ниже: (Есть ошибка несоответствия типов, потому что вы добавляете значение с плавающей запятой в список массива "records")

Примечание: пожалуйста, попробуйте добавить такое же количество элементов списка массивов в "xValsOriginalMillis", как в массиве "records", в противном случае он будет выдает ArrayIndexOutOfBound Exception.

class MainLineActivity : AppCompatActivity() {

    private lateinit var mLineChart: LineChart
    private var entries = java.util.ArrayList<Entry>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_line)
        mLineChart = findViewById(R.id.lineChart)

        entries.add(Entry(0f, 5f))
        entries.add(Entry(1f, 10f))
        entries.add(Entry(2f, 15f))
        entries.add(Entry(3f, 20f))
        entries.add(Entry(4f, 5f))
        entries.add(Entry(5f, 10f))
        // Log.d("itoNa", "$entries")

        val set1 = LineDataSet(entries, "Water")
        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.CUBIC_BEZIER
        mLineChart.description.text = ""
        mLineChart.legend.isEnabled = false
        mLineChart.invalidate()
        mLineChart.axisRight.isEnabled = false
        mLineChart.axisLeft.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)
        mLineChart.axisRight.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART)


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

        val xValsDateLabel = ArrayList<String>()

        val xValsOriginalMillis = ArrayList<Long>()
        xValsOriginalMillis.add(1554875423736L)
        xValsOriginalMillis.add(1555275494836L)
        xValsOriginalMillis.add(1585578525900L)
        xValsOriginalMillis.add(1596679626245L)
        xValsOriginalMillis.add(1609990727820L)
        xValsOriginalMillis.add(1709990727820L)

        for (i in xValsOriginalMillis) {
            val mm = i / 60 % 60
            val hh = i / (60 * 60) % 24
            val mDateTime = "$hh:$mm"
            xValsDateLabel.add(mDateTime)
        }

        xAxis.valueFormatter = (MyValueFormatter(xValsDateLabel))
    }


    class MyValueFormatter(private val xValsDateLabel: ArrayList<String>) : ValueFormatter() {

        override fun getFormattedValue(value: Float): String {
            return value.toString()
        }

        override fun getAxisLabel(value: Float, axis: AxisBase): String {
            if (value.toInt() >= 0 && value.toInt() <= xValsDateLabel.size - 1) {
                return xValsDateLabel[value.toInt()]
            } else {
                return ("").toString()
            }
        }
    }

}

Вот скриншот, прикрепленный ниже того, чего я достиг с приведенным выше кодом:

enter image description here

...