02.MPAndroidChart堆叠柱状图数据接入

  1. 先看一下源码支持的数据类型和构造方法
	   public BarEntry(float x, float y) {
	       super(x, y);
	   }
	      
	   public BarEntry(float x, float[] vals) {
	       super(x, calcSum(vals));
	       this.mYVals = vals;
	       calcPosNegSum();
	       calcRanges();
	   }
  1. 简单的柱状图就不说了,用的是第一个构造方法,对于复杂的堆叠柱状图,用的则是第二个构造方法,y值是一个float数组,这个数组需要去json里加工一下

  2. 贴一下我的json数据02.MPAndroidChart堆叠柱状图数据接入_第1张图片

  3. 我的逻辑是所有的date字段只取一遍,不要取重复,当作x轴,然后根据时间轴取匹配每一个item项里的y值,我这里是qty值

         		Collections.sort(mDateList);
                mChartSetting.setXAxisValues(mDateList);//X轴数据
                ArrayList<IBarDataSet> dataSetList = new ArrayList<>();
                List<BarEntry> yValues = new ArrayList<>();// Y轴数据
                for (int i = 0; i < mDateList.size(); i++) {
                    List<Float> valueEntry = new ArrayList<>();
                    for (int j = 0; j < powerBeans.size(); j++) {
                        List<DataBean> dataBeanList = powerBeans.get(j).getData();
                        if (dataBeanList != null && dataBeanList.size() > 0) {
                            Collections.sort(dataBeanList);
        
                            List<String> dateList = new ArrayList<>();
        
                            for (int m = 0; m < dataBeanList.size(); m++) {
                                dateList.add(dataBeanList.get(m).getDate());
                            }
                            Collections.sort(dateList);
                            for (int k = 0; k < dateList.size(); k++) {
                                if (dateList.contains(mDateList.get(i))) {
                                    if (mDateList.get(i).equals(dateList.get(k))) {
                                        valueEntry.add(dataBeanList.get(k).getQty());
                                    }
                                } else {//如果value项里没有对应的x轴时间的value值,添加0.0
                                    valueEntry.add(0f);
                                    break;
                                }
                            }
                        }
                    }
                    if (valueEntry.size() > 0) {
                        yValues.add(new BarEntry(i, listToFloat(valueEntry)));
                    }
    
  4. 创建一个valueEntry集合,泛型是Float,List valueEntry = new ArrayList<>();匹配日期,如果x轴日期有对应的value值,valueEntry.add(dataBeanList.get(k).getQty());如果没有,valueEntry.add(0f);这样可以保证每一个valueEntry集合里有相等数量的元素,方便为后面的图例和自定义markview使用

  5. 遍历完之后 yValues.add(new BarEntry(i, listToFloat(valueEntry))); listToFloat()把Float集合转数组,返回加工后需要的float数组

        /**
         * Float集合转数组
         *
         * @param valueEntry
         * @return
         */
        private float[] listToFloat(List<Float> valueEntry) {
            Float[] ary = valueEntry.toArray(new Float[0]);
            float b[] = new float[ary.length];
            for (int m = 0; m < ary.length; m++) {
                b[m] = ary[m];
            }
            return b;
        }
    
  6. 数据加工完成,显示柱状图

    BarDataSet barDataSet = new BarDataSet(yValues, "");
            barDataSet.setDrawIcons(false);
            barDataSet.setColors(getColors(mLegendList.size()));
            barDataSet.setStackLabels(listToString(mLegendList));
            barDataSet.setHighLightColor(0xff666666);
            dataSetList.add(barDataSet);
    
            BarData barData = new BarData(dataSetList);
            barData.setValueFormatter(new StackedValueFormatter(false, "", 0));
            barData.setValueTextColor(Color.GRAY);
            barData.setDrawValues(false);
    
            if (barData.getDataSetCount() > 0) {
                mChartView.setData(barData);
                mMarkView = new BarChartMarkView(PowerStackedBarActivity.this, mDateList, barData);
                mMarkView.setChartView(mChartView);
                mChartView.setMarker(mMarkView);
                mChartView.animateY(1000);
            } else {
                mChartView.setNoDataText(getString(R.string.no_data));
            }
            mChartView.setFitBars(true);
            mChartView.invalidate();
    

    02.MPAndroidChart堆叠柱状图数据接入_第2张图片
    下一篇记录自定义样式的MarkView;

你可能感兴趣的:(02.MPAndroidChart堆叠柱状图数据接入)