Как мне получить записи для моей линейной диаграммы? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать линейную диаграмму на основе некоторых данных из веб-сервиса.Хотя я не уверен, правильно ли я установил все данные для 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, поэтому каждый второй раз янажмите кнопку, чтобы вызвать сбой приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...