- 先看一下源码支持的数据类型和构造方法
public BarEntry(float x, float y) {
super(x, y);
}
public BarEntry(float x, float[] vals) {
super(x, calcSum(vals));
this.mYVals = vals;
calcPosNegSum();
calcRanges();
}
-
简单的柱状图就不说了,用的是第一个构造方法,对于复杂的堆叠柱状图,用的则是第二个构造方法,y值是一个float数组,这个数组需要去json里加工一下
-
贴一下我的json数据
-
我的逻辑是所有的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))); }
-
创建一个valueEntry集合,泛型是Float,List valueEntry = new ArrayList<>();匹配日期,如果x轴日期有对应的value值,valueEntry.add(dataBeanList.get(k).getQty());如果没有,valueEntry.add(0f);这样可以保证每一个valueEntry集合里有相等数量的元素,方便为后面的图例和自定义markview使用
-
遍历完之后 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; }
-
数据加工完成,显示柱状图
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();
下一篇记录自定义样式的MarkView;