2017-01-11 5 views
2

Ich bin totaler Anfänger in Android-Entwicklung und ich mache App für Klasse. Meine Aufgabe ist es, JSON-Daten in der Anwendung als Text und Graphen anzuzeigen. Ich benutze Retrofit 2, um es als Text in einer Aktivität anzuzeigen, aber ich habe Probleme mit Graphen, ich weiß nicht wie ich es machen soll (ich lerne immer noch, alles, was ich bisher gemacht habe, war mit Hilfe aus Tutorials).Plotting Liniendiagramm mit JSON-Daten, Android

Die Daten sieht wie folgt aus (dies ein Beispiel ist):

{ 
"id": 1, 
"measurements": [{ 
    "time": "18:25:43", 
    "value": 25.4 
}, 
{ 
    "time": "18:35:43", 
    "value": 27.3 
}, 
{ 
    "time": "18:45:21", 
    "value": 26.3 
}, 
{ 
    "time": "18:55:43", 
    "value": 25.2 
}, 
{ 
    "time": "19:05:43", 
    "value": 25.2 
}, 
{ 
    "time": "19:15:43", 
    "value": 25.2 
}, 
{ 
    "time": "19:25:43", 
    "value": 24.9 
}] 
} 

ich this gefunden habe, aber ich bin mir nicht sicher, was als nächstes zu tun ist. Sollte ich zwei Array-Listen mit Daten erstellen (wenn das die Antwort ist, wie geht das?), Oder gibt es eine bessere Lösung, die direkt Zeit und Wert benötigt und Diagramm mit der Zeit als X-Achse und Wert als Y-Achse darstellt.

Antwort

1

Hier ist Ihre Lösung.

Zuerst müssen Sie in Abhängigkeiten hinzufügen

dependencies{ 
    compile 'com.github.PhilJay:MPAndroidChart:v2.2.3' 
    ....} 

Jetzt in Ihrem XML-Code unten hinzufügen

<com.github.mikephil.charting.charts.LineChart 
       android:id="@+id/chart1" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 

Und jetzt in Ihrem Java-Code

ArrayList<Entry> x; 
ArrayList<String> y; 
private LineChart mChart; 
public String TAG = "YOUR CLASS NAME"; 

Innen onCreate Methode

x = new ArrayList<Entry>(); 
    y = new ArrayList<String>(); 
    mChart = (LineChart) view.findViewById(R.id.chart1); 
    mChart.setDrawGridBackground(false); 
    mChart.setDescription(""); 
    mChart.setTouchEnabled(true); 
    mChart.setDragEnabled(true); 
    mChart.setScaleEnabled(true); 
    mChart.setPinchZoom(true); 
    mChart.setMarkerView(mv); 
    XAxis xl = mChart.getXAxis(); 
    xl.setAvoidFirstLastClipping(true); 
    YAxis leftAxis = mChart.getAxisLeft(); 
    leftAxis.setInverted(true); 
    YAxis rightAxis = mChart.getAxisRight(); 
    rightAxis.setEnabled(false); 
    Legend l = mChart.getLegend(); 
    l.setForm(Legend.LegendForm.LINE); 

Rufen Sie diese Methode beim Klicken auf die Schaltfläche auf.

private void drawChart() { 

    String tag_string_req = "req_chart"; 

    StringRequest strReq = new StringRequest(Request.Method.POST, "YOUR URL", 
      new Response.Listener<String>() { 

       @Override 
       public void onResponse(String response) { 

        Log.d(TAG, "Response: " + response); 

        try { 
         JSONObject jsonObject = new JSONObject(response); 
         String id = jsonObject.getString("id"); 
         JSONArray jsonArray = jsonObject.getJSONArray("measurements"); 
         for (int i = 0; i < jsonArray.length(); i++) { 

          int value = jsonObject.getInt("value"); 
          String date = jsonObject.getString("time"); 
          x.add(new Entry(value, i)); 
          y.add(date); 

         } 
         LineDataSet set1 = new LineDataSet(x, "NAV Data Value"); 
         set1.setLineWidth(1.5f); 
         set1.setCircleRadius(4f); 
         LineData data = new LineData(y, set1); 
         mChart.setData(data); 
         mChart.invalidate(); 

        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e(TAG, "Error: " + error.getMessage()); 
     } 
    }); 
    strReq.setRetryPolicy(new RetryPolicy() { 

     @Override 
     public void retry(VolleyError arg0) throws VolleyError { 
     } 

     @Override 
     public int getCurrentTimeout() { 
      return 0; 
     } 

     @Override 
     public int getCurrentRetryCount() { 
      return 0; 
     } 
    }); 
    strReq.setShouldCache(false); 
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 
} 

AppController Code wie hier

public class AppController extends Application { 
public static final String TAG = AppController.class.getSimpleName(); 
private RequestQueue mRequestQueue; 
private static AppController mInstance; 
@Override 
public void onCreate() { 
    super.onCreate(); 
    mInstance = this; 
} 

    public static synchronized AppController getInstance() { 
    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
    } 
    return mRequestQueue; 
} 

public <T> void addToRequestQueue(Request<T> req, String tag) { 
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 
    getRequestQueue().add(req); 
} 
} 

hoffe, dies wird Ihnen helfen. Wenn irgendwelche Probleme auftreten, lassen Sie es mich wissen.

+0

Am Anfang kann ich nicht lösen: com.github.PhilJay: MPAndroidChart: v2.2.3 – mustangws

+0

Okay, ich habe eine Lösung für dieses Problem gefunden, aber jetzt gibt es eine Menge von "Kann Methode oder Variable nicht auflösen" . Es passiert bei StringRequest, Methode, Listener, ErrorListener, VolleyError, getMessage, setRetryPolicy, RetryPolicy, setShouldCache, AppController. Kann ich drawChart() auch in onCreate setzen, anstatt es beim Klick auf die Schaltfläche aufzurufen? – mustangws

+0

TAG und mv (mv in mChart.setMarkerView (mv)) sind ebenfalls rot. – mustangws