2017-01-11 5 views
2

Я начинаю начинать в Android-разработке, и я делаю приложение для класса. Мое предпочтение заключается в отображении данных JSON в приложении в виде текста и графиков. Я использую Retrofit 2, чтобы отображать его как текст в одном действии, но у меня проблемы с графиками, я не знаю, как это сделать (я все еще участвую, все, что я делал до сих пор, было с помощью из учебников).График построения графика с данными JSON, Android

Данные выглядит следующим образом (это пример):

{ 
"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 
}] 
} 

Я нашел this, но я не уверен, что делать дальше. Должен ли я создавать два списка массивов с данными (если это ответ, как это сделать?), Или есть лучшее решение, которое непосредственно занимает время и значение и график графика со временем как ось X и значение как ось Y.

ответ

1

большое спасибо.

Сначала вы должны добавить в зависимости

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

Теперь в вашем XML добавить ниже код

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

И теперь в вашем коде Java

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

Внутри OnCreate метод

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); 

Вызовите этот метод при нажатии кнопки.

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, как здесь

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); 
} 
} 

Надеется, что это поможет. Если возникнут какие-либо проблемы, дайте мне знать.

+0

В начале я получаю Не удалось решить: com.github.PhilJay: MPAndroidChart: v2.2.3 – mustangws

+0

в порядке, я нашел решение этой проблемы, но теперь существует много «Невозможно разрешить метод или переменную», , Это происходит в StringRequest, Method, Listener, ErrorListener, VolleyError, getMessage, setRetryPolicy, RetryPolicy, setShouldCache, AppController. Кроме того, могу ли я просто нарисовать drawChart() в onCreate, а не называть его нажатием кнопки? – mustangws

+0

TAG и mv (mv в mChart.setMarkerView (mv)) также являются красными. – mustangws

Смежные вопросы