从下载的数据中绘制barChart

时间:2017-04-04 09:14:52

标签: java android mpandroidchart

这是我的问题。我正在尝试从我从API下载的数据中绘制图表。要下载数据,请使用OTTORetrofit库。对于绘制图表,我正在使用MPAndroidChart。在MagnitudeFrequencyChart我准备在图表上创建数据。当我将下载的数据实现到构造函数并在onServerEvent中创建图表方法时,我得到的信息是我的图表没有可用的数据。是否可以在OnCreateView方法之外创建barChart?或者我如何将下载的数据实施到OnCreateView

public class GraphFragment extends Fragment {

    private View view;
    private BarChart barChart;
    private Bus bus = BusProvider.getInstance();
    private MagnitudeFrequencyChart magnitudeFrequencyChart;
    private List<Feature> features;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_graph, container, false);
        barChart = (BarChart) view.findViewById(R.id.barChart_magnitudeFrequency);

        return view;
    }

    @Subscribe
    public void onServerEvent(ServerEvent serverEvent) {

        features = serverEvent.getDataResponse().getFeatures();
        magnitudeFrequencyChart = new MagnitudeFrequencyChart(features, barChart);
        magnitudeFrequencyChart.getMagnitudeFrequencyChart();

    }

    @Subscribe
    public void onErrorEvent(ErrorEvent errorEvent) {
        Toast.makeText(getActivity(), "" + errorEvent.getErrorMsg(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onResume() {
        super.onResume();
        bus.register(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        bus.unregister(this);
    }
}

我正在创建图表的类:

public class MagnitudeFrequencyChart {

    private List<Feature> features;
    private BarChart barChart;

    public MagnitudeFrequencyChart(List<Feature> features, BarChart barChart) {
        this.features = features;
        this.barChart = barChart;
    }

    public void getMagnitudeFrequencyChart() {

        int mag3 = 0;
        int mag4 = 0;
        int mag5 = 0;
        int mag6 = 0;
        int mag7 = 0;
        int mag8 = 0;
        int mag9 = 0;

        for (int i = 0; i < features.size(); i++) {

            double magnitude = features.get(i).getProperties().getMag();

            if (magnitude >= 3 && magnitude <= 3.99) {
                mag3++;
            } else if (magnitude >= 4 && magnitude <= 4.99) {
                mag4++;
            } else if (magnitude >= 5 && magnitude <= 5.99) {
                mag5++;
            } else if (magnitude >= 6 && magnitude <= 6.99) {
                mag6++;
            } else if (magnitude >= 7 && magnitude <= 7.99) {
                mag7++;
            } else if (magnitude >= 8 && magnitude <= 8.99) {
                mag8++;
            } else if (magnitude >= 9 && magnitude <= 9.99) {
                mag9++;
            }
        }

        ArrayList<BarEntry> yData = new ArrayList<>();
        yData.add(new BarEntry(mag4, 0));
        yData.add(new BarEntry(mag5, 1));
        yData.add(new BarEntry(mag6, 2));
        yData.add(new BarEntry(mag7, 3));
        yData.add(new BarEntry(mag8, 4));
        yData.add(new BarEntry(mag9, 5));

        String xValues[] = {"4.0+", "5.0+", "6.0+", "7.0+", "8.0+", "9.0+"};

        ArrayList<String> xData = new ArrayList<>();
        for (int i = 0; i < xValues.length; i++) {
            xData.add(xValues[i]);
        }

        BarDataSet barDataSet = new BarDataSet(yData, "Chart");
        barDataSet.setColors(ColorTemplate.COLORFUL_COLORS);

        BarData data = new BarData(xData, barDataSet);
        barChart.setData(data);
        barChart.getAxisRight().setDrawLabels(false);
        barChart.animateY(2000);
    }
}

1 个答案:

答案 0 :(得分:0)

findViewById()方法内的BarChart上使用onCreateView()是正确的。

我认为您真正想要做的是隐藏图表,直到数据从服务器到达。如果是这种情况,您需要做的就是:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_graph, container, false);
    barChart = (BarChart) view.findViewById(R.id.barChart_magnitudeFrequency);
    barChart.setVisibility(View.INVISIBLE);
    return view;
}

然后在getMagnitudeFrequencyChart()内:

    BarData data = new BarData(xData, barDataSet);
    barChart.setData(data);
    barChart.setVisibility(View.VISIBLE);
    barChart.getAxisRight().setDrawLabels(false);
    barChart.animateY(2000);
}