HorizontalBarChart moveViewToX не работает - PullRequest
0 голосов
/ 19 января 2019

Сводка При использовании BarChart все работает как положено, но moveViewToX не работает на HorizontalBarChart.Я тестировал с тем же кодом, только изменяя XML, и ошибка влияет только на HorizontalBarChart

Я искал открытые проблемы (наиболее релевантным был # 2546, который закрыт, и предлагаемое решение не сработалов моем случае) и поиск в StackOverflow, но я пока не нашел решения.

Устройство: Устройство: Xiaomi Redmi Note 4 Android Версия 6.0 Библиотека Версия 3.1.0-alpha

Воткод, связанный, написан на Kotlin.Вот xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.github.mikephil.charting.charts.HorizontalBarChart
        android:id="@+id/priceAlertsChart"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>
</LinearLayout>

и файл kt:

    override fun onCreate(savedInstanceState: Bundle?) {
        val priceAlerts = mutableListOf<PriceChangeInfo>()
        for(i in 0..20) {
            priceAlerts.add(i,PriceChangeInfo(i.toString()
            ,Random.nextDouble(-2.5,2.5)))
        }
        showPercentChangeDialog(priceAlerts.toTypedArray(), Date().time)
    }

    @SuppressLint("InflateParams")
    private fun showPercentChangeDialog(priceChangeInfo:Array<Parcelable>?, lastUpdate:Long)
    {
        val items = priceChangeInfo?.map {
            it as PriceChangeInfo
        }?.reversed() ?: return

        val v = layoutInflater.inflate(R.layout.price_alerts_dialogos,null)
       // v.lastUpdateTextView.text=getString(R.string.changes_since,timeLapse(lastUpdate))
        v.priceAlertsChart.apply {
            xAxis.apply {
                position = XAxis.XAxisPosition.BOTTOM
                setDrawAxisLine(true)
                setDrawGridLines(false)
                granularity = .3f
                labelCount = if(items.size>10)10 else items.size
                valueFormatter = IAxisValueFormatter { value, _ ->
                    items[value.toInt()].symbol
                }
            }

            withMultiple(axisLeft,axisRight){
                setDrawAxisLine(true)
                setDrawGridLines(true)
            }

            legend.isEnabled = false
            setDrawBarShadow(false)
            //setDrawValueAboveBar(true)
            description.isEnabled = false
            setPinchZoom(false)
            setDrawGridBackground(false)

            data = {
                val green = Color.rgb(110, 190, 102)
                val red = Color.rgb(211, 74, 88)


                val entries = mutableListOf<BarEntry>()
                val colors = mutableListOf<Int>()

                items.forEachIndexed { index, info ->
                    colors.add(if(info.change>0) green else red)
                    entries.add(BarEntry(index.toFloat(),info.change.toFloat(),info.symbol))
                }

                val set1 = BarDataSet(entries,"changes").apply {
                    setDrawIcons(false)
                    setDrawValues(false)
                    setColors(colors)
                    valueFormatter = IValueFormatter {
                        _, entry, _, _ ->
                        formatNumber(entry.y.toDouble(),false,false,decimals = 2)+"%"
                    }
                }

                val dataSets = mutableListOf<IBarDataSet>().apply {
                    add(set1)
                }

                BarData(dataSets).apply {
                    setValueTextSize(10f)
                    barWidth = .4f
                }

            }()

            setVisibleXRangeMaximum(10f)
            //this doesn't work on HorizontalBarChart
            moveViewToX(data.entryCount.toFloat())
        }
        AlertDialog.Builder(this).setTitle(R.string.price_alerts).setView(v)
                .setPositiveButton(R.string.ok) { _: DialogInterface, _: Int ->
                    intent?.extras?.clear()
                }.show()


    }

//dependencies
fun<T> withMultiple(vararg args: T, block: T.() -> Unit) {
  args.forEach {
    it.apply (block)
  }
}

data class PriceChangeInfo(var symbol:String, var  change:Double):Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readString()!!,
            parcel.readDouble()) {}

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(symbol)
        parcel.writeDouble(change)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<PriceChangeInfo> {
        override fun createFromParcel(parcel: Parcel): PriceChangeInfo {
            return PriceChangeInfo(parcel)
        }

        override fun newArray(size: Int): Array<PriceChangeInfo?> {
            return arrayOfNulls(size)
        }
    }
}

Я уже открыл проблему на github: https://github.com/PhilJay/MPAndroidChart/issues/4397

Любой совет |взломать |Возможное решение будет высоко оценено.Заранее спасибо.

1 Ответ

0 голосов
/ 20 января 2019

Я решил это, используя:

moveViewTo(0f,data.entryCount.f,YAxis.AxisDependency.LEFT)
...