Я пытаюсь создать линейную диаграмму на основе некоторых данных из веб-сервиса.Хотя я не уверен, правильно ли я установил все данные для LineDataSet.
Итак, у меня есть этот список с некоторыми данными, каждый объект в списке имеет свой собственный идентификатор в веб-сервисе.Всякий раз, когда вы нажимаете один объект в списке и нажимаете кнопку «показать диаграмму» (до сих пор эта кнопка называется просто «тест», поскольку я ее еще не стилизовал), она запускает новое действие и запускает веб-сервис, где есть другиеидентификаторы.Идентификаторы будут сравниваться с другим вызовом веб-сервиса и извлекать данные из него.В данных из нового вызова веб-сервиса должны быть указаны «даты» и «процент заполнения» на диаграмме с «датами» в качестве оси X.
Вызов веб-сервиса с «датами» и «процентом полного» равенне проблема, я проверил это, и я получаю все правильные данные из него как JsonArray.Я выложу соответствующий код ниже.Вопрос в том, может ли кто-нибудь помочь мне настроить это правильно, так как я явно делаю что-то не так.
Скажите, если мне нужно предоставить больше информации или это слишком запутанно, я все еще оченьмолодой разработчик.
public class ContainerListActivity extends AppCompatActivity...
{
// LISTS
.....
ArrayList<LineChartObject> lineChartObjectArrayList;
ArrayList<Entry> containerFullEntry = new ArrayList<>();
ArrayList<String> percentDatesList = new ArrayList<>();
}
protected void onCreate(@Nullable Bundle savedInstanceState
{
.....
super.onCreate(savedInstanceState);
getContianerGraph = new GetContianerGraph();
lineChart = findViewById(R.id.lineChart);
.....
}
public void onClick(View view) {
hideSoftKeyboard(this);
.....
else if(view == testButton)
{
Intent intent = new Intent(this, ContainerGraphActivity.class);
startActivity(intent);
getContianerGraph.execute();
}
}
//WEBSERVICE
public class GetContianerGraph extends AsyncTask<Void, Void, Void> {
String error = "";
JSONArray graphJsonArray;
Helper helper = new Helper();
private LineChartDataObject lineChartDataObject;
@Override
protected void onPreExecute()
{
lineChartObjectArrayList = new ArrayList<>();
}
//BACKGROUND WORK
@Override
protected Void doInBackground(Void... voids) {
HttpURLConnection urlConn = null;
try {
//If token expires
if (Calendar.getInstance(TimeZone.getTimeZone("GMT")).after(Helper.tokenDate(fileHelper.getPropertyFromSharedPreferences(getString(R.string.key_token_expires))))) {
LoginActivity.sessionExpired = true;
Helper.goToActivity(ContainerListActivity.this, LoginActivity.class);
return null;
} else {
//String LeaseId = fileHelper.getPropertyFromSharedPreferences(getString(R.string.key_lease_id));
//Setup connection
URL url = new URL(getString(R.string.ws_get_container_graph)+String.valueOf(getSelectedContainerObject().getContId()));
urlConn = (HttpURLConnection) url.openConnection();
urlConn.addRequestProperty("cache-control", "no-cache");
urlConn.addRequestProperty("Authorization", "Bearer " + fileHelper.getPropertyFromSharedPreferences(getString(R.string.key_token)));
//Read from webservice
BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
br.close();
//Values from webservice
String jsonString = sb.toString();
graphJsonArray= new JSONArray(jsonString);
if (urlConn.getResponseCode() != HttpURLConnection.HTTP_OK &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_CREATED &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_ACCEPTED &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_NOT_AUTHORITATIVE &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_NO_CONTENT &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_RESET &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_OK &&
urlConn.getResponseCode() != HttpURLConnection.HTTP_PARTIAL)
{
error = String.valueOf(urlConn.getRequestMethod());
}
}
} catch (IOException | JSONException e) {
e.printStackTrace();
return null;
} finally {
if (urlConn != null) {
try {
urlConn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
for (LineChartObject lineChartObject : lineChartObjectArrayList) {
int i = lineChartObjectArrayList.indexOf(lineChartObject);
containerFullEntry.add(new Entry(i, lineChartObject.getPercentFull()));
Date date = Helper.parseWebserviceDateString(lineChartObject.getMesurementTime());
percentDatesList.add(Helper.formatDate(date, "dd-MM-yyy"));
}
runOnUiThread(() -> {
//dataset
LineDataSet percentageDataSet = new LineDataSet(containerFullEntry, "%");
percentageDataSet.setDrawCircles(false);
percentageDataSet.setColor(0xFF5989BD);
percentageDataSet.setDrawValues(false);
percentageDataSet.setLineWidth(2);
//create linedata
LineData lineData = new LineData();
lineData.addDataSet(percentageDataSet);
lineChartDataObject.setPercentFullDataSet(percentageDataSet);
//set line data
lineChartDataObject.getLineChart().setData(lineData);
//set x-axis formatter
XAxis xAxis = lineChartDataObject.getLineChart().getXAxis();
xAxis.setValueFormatter((value, axis) -> {
int index = Math.round(value);
return index < percentDatesList.size() ? percentDatesList.get(index) : "";
});
//set label count
xAxis.setLabelCount(3, true);
//Refresh LineChart
lineChartDataObject.getLineChart().invalidate();
});
}
System.out.println("///////////////////////////////////////" + graphJsonArray);
return null;
}
//After
@Override
protected void onPostExecute(Void aVoid) {
if (error.equals("")) {
try {
if (graphJsonArray != null) {
for (int i = 0; i < graphJsonArray.length(); i++) {
LineChartObject lco = new LineChartObject(graphJsonArray.getJSONObject(i).getString("MesurementTime"),
graphJsonArray.getJSONObject(i).getInt("PercentFull"));
lineChartObjectArrayList.add(lco);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
super.onPostExecute(aVoid);
}
}
#ObjectClass for linechart:
public class LineChartDataObject {
private View lineChartLayout;
private LineChart lineChart;
private LineDataSet percentFullDataSet;
private Activity activity;
public LineChartDataObject( Activity activity) {
this.activity = activity;
}
//********************************************/
// Linechart
//********************************************/
public void setPercentFullDataSet(LineDataSet percentFullDataSet)
{
this.percentFullDataSet = percentFullDataSet;
}
public LineDataSet getPercentFullDataSet()
{
return percentFullDataSet;
}
public LineChart getLineChart()
{
return lineChart;
}
public int getLineChartVisibility()
{
if(lineChart == null)
{
return View.GONE;
}
else
{
return lineChartLayout.getVisibility();
}
}
//********************************************/
// Setup linechart
//********************************************/
public void setLineChart(View resourceLineChart)
{
this.lineChartLayout = resourceLineChart;
lineChart = resourceLineChart.findViewById(R.id.lineChart);
lineChart.setExtraOffsets(5,0,5,0);
lineChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
lineChart.getLegend().setEnabled(false);
lineChart.setHighlightPerDragEnabled(false);
lineChart.setHighlightPerTapEnabled(false);
lineChart.setDrawGridBackground(false);
lineChart.getDescription().setEnabled(false);
lineChart.setNoDataText(activity.getString(R.string.no_data_available));
Paint p = lineChart.getPaint(Chart.PAINT_INFO);
p.setColor(0xFF0A4EA3);
}
}
Итак, как уже упоминалось, мне нужно установить данные из моего веб-сервиса в мою диаграмму, прежде всего, это не помещает какие-либо данные вграфик.
Второе: он возвращается к предыдущему виду с помощью кнопки тестирования.Я думаю, я знаю почему, потому что во время веб-службы он вызывает предыдущее представление, хотя я не уверен, как это исправить.
Наконец, я изо всех сил пытаюсь правильно разместить .execute, поэтому каждый второй раз янажмите кнопку, чтобы вызвать сбой приложения.