这是我的问题。我正在尝试从我从API下载的数据中绘制图表。要下载数据,请使用OTTO
和Retrofit
库。对于绘制图表,我正在使用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);
}
}
答案 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);
}