Android MPAndroidCharts LineChart跳过值

时间:2016-07-07 23:41:16

标签: android sqlite mpandroidchart

我正在使用我的应用程序上的MPAndroid图表从我的sqlite数据库绘制图表,使用Y轴的“权重”值和X轴的“日期”值。

问题是我的数据库中只有一些行具有该权重值。当所有行都具有权重布局时,我的代码就像一个魅力,但当有一行没有权重值,而下一行包含该权重值时,它会在图表的YAxes上留下一个空格,altought日期值在XAxes上设置。因此,在没有权重值的每一行的Y轴上都会遗漏一个值,因为权重行之后的值会向前移动一个点。例如:enter image description here

我有用于设置图表的代码:

public void setUpCharts(){
        chart = (LineChart) rootView.findViewById(R.id.weightChart);

        chart.setNoDataTextDescription("Nothing");
        chart.setDrawBorders(false);
        chart.setDescription("");
        chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
        chart.getAxisRight().setEnabled(false);
        chart.getAxisLeft().setEnabled(false);
        chart.getAxisLeft().setDrawGridLines(false);
        chart.getAxisRight().setDrawGridLines(false);
        chart.getXAxis().setDrawGridLines(false);
        chart.getXAxis().setDrawAxisLine(false);
        chart.getLegend().setEnabled(false);

        chart.setScaleEnabled(false);
        chart.setPinchZoom(false);
        chart.setDoubleTapToZoomEnabled(false);


        weights = new ArrayList<>(); //Pesos
        dates = new ArrayList<String>(); //Días del mes

        getChartData();

        LineDataSet dataSet = new LineDataSet(weights, "Weights");

        dataSet.setDrawCubic(false);
        dataSet.setCircleRadius(4);
        dataSet.setLineWidth(3);
        dataSet.setDrawValues(true);
        dataSet.setColor(getContext().getResources().getColor(R.color.colorWeightChart));
        dataSet.setCircleColor(getContext().getResources().getColor(R.color.colorWeightChart));
        dataSet.setCircleColorHole(getContext().getResources().getColor(R.color.colorWeightChart));
        LineData data = new LineData(dates, dataSet);
        chart.setData(data);

        //LimitLine
        String weight_get = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("Goal_weight", null);
        if(!weight_get.equals(null) && !weight_get.equals("")){
            float weight_goal = Float.valueOf(weight_get);
            YAxis leftAxis = chart.getAxisLeft();
            LimitLine ll = new LimitLine(weight_goal);
            ll.setLineColor(getContext().getResources().getColor(R.color.weightTabFAB));
            ll.setLineWidth(1f);
            ll.enableDashedLine(10f, 10f, 0f);
            leftAxis.addLimitLine(ll);

            float YMax= dataSet.getYMax();
            if(weight_goal > YMax){
                float difference = weight_goal - YMax;
                chart.getAxisRight().setAxisMaxValue(weight_goal + difference); //So the limit line will be always visible
                chart.getAxisLeft().setAxisMaxValue(weight_goal + difference);
            }
        }

        chart.setVisibleXRangeMaximum(5f);
    }

我使用getChartData设置所有图表数据,从我的sqlite数据库中获取值。它应该只添加权重存在的行的值,实际上日志显示它正常工作,所以我不知道如何解决它。

protected void getChartData(){
    IDs = new ArrayList<Integer>();
    Cursor data = dataSource.getAllItems();
    if(data!=null) {
        while(data.moveToNext()){
            int id = data.getInt(data.getColumnIndex(RecordsDataSource.ColumnRecords.ID_RECORDS));
            String weight=  data.getString(data.getColumnIndex(RecordsDataSource.ColumnRecords.WEIGHTS_RECORDS));

            if(weight!=null && !weight.equals("")){
                long milisDate =data.getLong(data.getColumnIndex(RecordsDataSource.ColumnRecords.DATES_RECORDS));
                String date = Utils.milisToDate(milisDate, "dd/MM");

                IDs.add(id);
                weights.add(new Entry(Float.valueOf(weight), id -1));
                dates.add(date);
                Log.i("ID "+ String.valueOf(id),"Not null, "+ weight);
            }else{
                Log.i("ID "+ String.valueOf(id), "Null");
            }
        }
        data.close();
    }
}

我一整天都试图解决这个问题,但没有任何效果。 有人可以帮帮我吗? 顺便说一句,抱歉我的英语不好。

1 个答案:

答案 0 :(得分:2)

问题出在id getChartData()方法中。 id正在跳过您的图表Entry位置。

而不是这个

weights.add(new Entry(Float.valueOf(weight), id -1));

为条目索引添加变量并在每次迭代时递增它

index++;
weights.add(new Entry(Float.valueOf(weight), index));

它应该有用。