Как установить метки на xAxis внутри линейной диаграммы Mpandroidchart?

Я пытаюсь дать метку xAxis внутри mpandroidchart в линейной диаграмме, но каждый раз получаю ошибку.

Где я неправ?

Или я должен следовать другому подходу?

Если я должен, то что это?

 public class OpdIpdAnalysis extends AppCompatActivity{

            ApiService service;
            TokenManager tokenManager;
            Call<ModelResponse> call;

            private ListView mListView;

             //GraphView
            private LineChart mLineChart;

             @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_opd_ipd_analysis);


                //GraphView casting
                mLineChart =(LineChart) findViewById(R.id.lineChart);
                mLineChart.setTouchEnabled(true);
                mLineChart.setPinchZoom(true);

                    //code for retrofit call

                    call = service.getAllOpdIpdData();
                    call.enqueue(new Callback<ModelResponse>() {
                        @Override
                        public void onResponse(Call<ModelResponse> call, Response<ModelResponse> response) {
                            myProgressBar.setVisibility(View.GONE);
                            if (response.isSuccessful() && response.body() != null) {
                                updatUI(response.body().getOpdIpdComparison());

                                List<Entry> entries1 = new ArrayList<>();
                                List<Entry> entries2 = new ArrayList<>();
                                //final List<String> xLabel = new ArrayList<>();

                                for (OpdIpdModel opdIpdModel : response.body().getOpdIpdComparison()){

                                    entries1.add(new Entry(opdIpdModel.getMonth(),opdIpdModel.getoPD()));
                                    entries2.add(new Entry(opdIpdModel.getMonth(), opdIpdModel.getiPD()));
                                    //xLabel.add(opdIpdModel.getMonthString());

                                    String[] xLabel = {opdIpdModel.getMonthString()};
                                    XAxis xAxis = mLineChart.getXAxis();
                                    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
                                    xAxis.setDrawGridLines(false);
                                    xAxis.setGranularity(1);
                                    xAxis.setAxisMinimum(1);
                                    xAxis.setCenterAxisLabels(true);
                                    xAxis.setValueFormatter(new MyXAxisValueFormatter(xLabel));
                                }

                                LineDataSet lineDataSet1 = new LineDataSet(entries1, "OpdLine");
                                lineDataSet1.setDrawCircles(false);
                                lineDataSet1.setLineWidth(4f);
                                lineDataSet1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
                                lineDataSet1.setColor(randomAndroidColor1);

                                LineDataSet lineDataSet2 = new LineDataSet(entries2, "IpdLine");
                                lineDataSet2.setDrawCircles(false);
                                lineDataSet2.setLineWidth(4f);
                                lineDataSet2.setMode(LineDataSet.Mode.CUBIC_BEZIER);
                                lineDataSet2.setColor(randomAndroidColor2);

                                //add the data
                                List<ILineDataSet> iLineDataSets = new ArrayList<>();
                                iLineDataSets.add(lineDataSet1);
                                iLineDataSets.add(lineDataSet2);

                                LineData lineData = new LineData(iLineDataSets);
                                mLineChart.setData(lineData);
                                mLineChart.setVisibility(View.VISIBLE);
                                mLineChart.animateXY(1500,1500);
                                mLineChart.setVisibleXRangeMaximum(10);

                                //mLineChart.setXAxisRenderer(new CustomXAxisRenderer(mLineChart.getViewPortHandler(),mLineChart.getTransformer(YAxis.AxisDependency.LEFT)));

                                Description description = new Description();
                                description.setText("Growth rate per month");
                                description.setTextSize(12);
                                description.setTextColor(Color.BLACK);
                                mLineChart.setDescription(description);
                                mLineChart.invalidate();

                            }
                        }           
        }

Мое приложение каждый раз вылетает.

И я получаю сообщение об ошибке:

java.lang.ArrayIndexOutOfBoundsException: длина = 4; индекс=4

Теперь, как я могу решить эту проблему и установить метку, как я ожидаю?


person Sheikh Asif Iqbal    schedule 07.10.2019    source источник


Ответы (1)


Проблема в том, что размер ваших записей1, записей2 и xValues ​​не одинаков. Вам нужно установить точку останова на следующей строке:

xAxis.setCenterAxisLabels(true);

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

person Muhammad Saad Rafique    schedule 08.10.2019
comment
Все мои значения списка равны, и когда я отлаживаю, он показывает значение правильно, но приложение вылетает с той же ошибкой. Выдает ошибку в этой строке @Override public String getFormattedValue (значение с плавающей запятой, ось AxisBase) { return mValues ​​[(int) value]; } - person Sheikh Asif Iqbal; 09.10.2019
comment
какую версию библиотеки вы используете? Потому что в моем IndexAxisValueFormatter getFormattedValue имеет только одно плавающее значение аргумента. Я использую v3.1.0 - person Muhammad Saad Rafique; 10.10.2019
comment
Моя версия 3.0.3 - person Sheikh Asif Iqbal; 10.10.2019
comment
Я меняю значение на: xAxis.setValueFormatter(new IndexAxisValueFormatter() { @Override public String getFormattedValue(значение с плавающей запятой) { return xLabel.get((int) value); } }); но все еще получаю ошибку - person Sheikh Asif Iqbal; 10.10.2019
comment
обновите версию своей библиотеки или, если это возможно, поделитесь своим проектом, я отлажу это - person Muhammad Saad Rafique; 11.10.2019
comment
Я сделал это, и все заработало, но первая метка не отображается, когда значение равно 0, снова происходит сбой: xAxis.setValueFormatter(new IndexAxisValueFormatter() { @Override public String getFormattedValue(float value) { if (value›=0) { if (value‹= xLabel.size() - 1){ return xLabel.get((int) value); } return ; } return ; } }); - person Sheikh Asif Iqbal; 13.10.2019