# XY-Plottet keine Daten obwohl Funktion ausgeführt wird



## nieselfriem (15. Jul 2022)

Hallo zusammen,

um mir einen Graph in meiner App zusammen zu bauen habe ich mir das Beispiel hier durchgearbeitet und es funktioniert auch, wie es soll.
Toll dachte ich, und nun packst du das in deinen eignen Kontext. Und schon geht da nichts mehr. Das heißt, die Funktion wird zwar aufgerufen, hat aber offenbar keine Einfluss auf den Plot, so das er die Daten darstellen würde.

Bei mir sieht es wie folgt aus. Ich spreche über http eine api von mir an, die liefert ein Json, dass packe ich in eine Liste meiner Data class und wenn diese gefüllt ist, dann tue wundersame Dinge 


```
val listCall: Call<GartenTempResponse> = service.getAllTemps("temps_today")
            listCall.enqueue(object : Callback<GartenTempResponse> {
                override fun onResponse(
                    call: Call<GartenTempResponse>,
                    response: Response<GartenTempResponse>?
                ) {
                    if (response!!.isSuccessful) {
                        val tempList: GartenTempResponse? = response.body()
                        val url = call.request().url()
                        val repsone_text = response.body()
                        val responseCode = response.code()
                        var laenge = tempList?.temperaturen?.size
                        val maxTemps = tempList?.let { CalcAggreateTemp(it) }?.calcMaxTemps()
                        val minTemps = tempList?.let { CalcAggreateTemp(it) }?.calcMinTemps()
                        val avgTemps =  tempList?.let { CalcAggreateTemp(it) }?.calcAvgTemps()
                        if (tempList != null) {
                            setXYPlot(tempList) //Plotten von Daten in einem Graph --> kein Plot der Daten
                            setRecyclerView(tempList) //Darstellung von Temperaturen und Zeit in einer Tabelle -->Funktioniert wunderbar
```

Plotfunktion
Im Grunde ist diese nicht anders als das was das Beispiel aus Github macht. Nur, dass ich aus meine Datenklasse mit Hilfsfunktion eine ArrayListe<Number> mache. Mal angenommen, dass haut nicht hin, wäre das ein Grund, den ich verstehe. Aber selbst wenn ich feste Werte für die Daten, wie in dem Beispiel eintrage, wird der Graph nicht geplottet.


```
private fun setXYPlot(tempList: GartenTempResponse) {
        var formatingTools = FormatingTools()
        val domainLabels = formatingTools.dateTimesListToArray(tempList.temperaturen)

        val series1: XYSeries = SimpleXYSeries(formatingTools.temps1ListToArray(tempList.temperaturen), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Aussen")
        val series2: XYSeries = SimpleXYSeries(formatingTools.temps2ListToArray(tempList.temperaturen), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Innen")
        val series1Format = LineAndPointFormatter(Color.BLUE, Color.BLACK,null, null)
        val series2Format = LineAndPointFormatter(Color.RED, Color.BLACK,null, null)
        series1Format.interpolationParams = CatmullRomInterpolator.Params(10, CatmullRomInterpolator.Type.Centripetal)
        series2Format.interpolationParams = CatmullRomInterpolator.Params(10, CatmullRomInterpolator.Type.Centripetal)
        var plot =  findViewById<com.androidplot.xy.XYPlot>(R.id.plot)
        plot.addSeries(series1,series1Format)
        plot.addSeries(series2,series2Format)

        plot.graph.getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).format = object : Format() {
            override fun format(
                obj: Any?,
                toAppendTo: StringBuffer,
                pos: FieldPosition
            ): StringBuffer {
                val i = Math.round((obj as Number).toFloat())
                return toAppendTo.append(domainLabels!![i])
            }

            override fun parseObject(source: String?, pos: ParsePosition): Any? {
                return null
            }

        }
        PanZoom.attach(plot)
    }
```


```
<androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="500dp"
            android:layout_marginStart="@dimen/card_view_marginStartEnd"
            android:layout_marginEnd="@dimen/card_view_marginStartEnd"
            android:layout_weight="5"
            android:background="@android:color/white"
            app:cardCornerRadius="@dimen/card_view_corner_radius"
            app:cardElevation="@dimen/card_view_elevation">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_horizontal"
                android:orientation="vertical">
            <com.androidplot.xy.XYPlot
                android:id="@+id/plot"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                style="@style/APDefacto.Light"
                app:title="Temperaturen"
                app:domainTitle="domain"
                />
            </LinearLayout>
        </androidx.cardview.widget.CardView>
```


Was mache ich falsch bzw habe ich nicht verstanden?

VG georg


----------



## Jw456 (15. Jul 2022)

Der Code  setzt eine ArrayList vom Typ Number ( int, fload ...) voraus
du hast aber  eines vom Typ GartenTempResponse.


----------



## nieselfriem (15. Jul 2022)

Jw456 hat gesagt.:


> Der Code  setzt eine ArrayList vom Typ Number ( int, fload ...) voraus
> du hast aber  eines vom Typ GartenTempResponse.


Das ist es leider nicht.


Wandel ich GartenTempResponse in ArrayLists vom Typ Number um mithilfe von meine Funtkionen temps1ListToArray, temps2ListToArray und dateTimesListToArray um
Habe ich einfach mal die Daten aus dem Beispiel statt meiner aus dem Datentyp GartenTempResponse inmeine Code eingefügt. 



```
val domainLabels = arrayOf<Number>(1,2,3,6,7,8,9,10,13,14);
        val series1Number = arrayOf<Number>(1,4,8,12,16,32,26,29,10,13);
        val series2Number = arrayOf<Number>(2,8,4,7,32,16,64,12,7,10);

        val series1 : XYSeries = SimpleXYSeries(Arrays.asList(* series1Number),SimpleXYSeries.ArrayFormat.Y_VALS_ONLY
            ,"Series 1");
        val series2 : XYSeries = SimpleXYSeries(Arrays.asList(* series2Number),SimpleXYSeries.ArrayFormat.Y_VALS_ONLY
            ,"Series 1");

        val series1Format = LineAndPointFormatter(Color.BLUE,Color.BLACK,null,null)
        val series2Format = LineAndPointFormatter(Color.DKGRAY,Color.LTGRAY,null,null)

        series1Format.setInterpolationParams(CatmullRomInterpolator.Params(10,
            CatmullRomInterpolator.Type.Centripetal))
        series2Format.setInterpolationParams(CatmullRomInterpolator.Params(10,
            CatmullRomInterpolator.Type.Centripetal))
```

und trotzdem wird nichts geplottet


----------



## Jw456 (15. Jul 2022)

Frage wird hier überhaupt die Instanz vom Widget gefundenen?

```
var plot = findViewById<com.androidplot.xy.XYPlot>(R.id.plot)
```

Wo bist du in einer Activity oder in einem Fragment?
In einer Activity sollte die Angabe in der Spitzen Klammer nicht nötig sein. 

Warum benutzt du nicht Viewbinding?
Damit wird findViewById fast nicht  mehr gebraucht.


----------



## Jw456 (15. Jul 2022)

Der Code von Github nutzt das

```
import kotlinx.android.synthetic.main.activity_main.*
```

Damit ist kein suchen mit findViewById notwendig.
Dafür musst du auch das plugin im Gradle einfügen.

Aber das ist leider auch veraltet  deshalb Viewbinding.


----------

