2017-04-04 4 views
0

Hier ist mein Problem. Ich versuche, ein Diagramm aus Daten zu erstellen, die ich von der API herunterlade. Um Daten herunterzuladen, verwende ich OTTO und Retrofit Bibliothek. Für die Zeichnung verwende ich MPAndroidChart. In MagnitudeFrequencyChart Ich bereite Daten vor, um auf Diagramm zu verursachen. Wenn ich heruntergeladene Daten in einen Konstruktor implementiere und eine Diagrammmethode in onServerEvent erstelle, bekomme ich Informationen, dass mein Diagramm keine Daten zur Verfügung hat. Ist es möglich, barChart außerhalb OnCreateView Methode zu erstellen? Oder wie kann ich meine heruntergeladenen Daten in OnCreateView implementieren?Zeichnung barChart von heruntergeladenen Daten

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); 
    } 
} 

Klasse, wo ich die Erstellung eines Diagramms:

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

Es ist nicht klar, was wollen Sie tun? – Krish

+0

Ich möchte ein Balkendiagramm aus Daten erstellen, die ich zuvor heruntergeladen habe – Dominik

+0

Sie können die Referenzliste in einer Singleton-Klasse behalten. – Krish

Antwort

0

Sie sind richtig findViewById() auf der BarChart innerhalb des onCreateView() Methode zu verwenden.

Ich denke, was Sie wirklich tun möchten, ist das Diagramm auszublenden, bis die Daten vom Server angekommen sind. Wenn das der Fall ist, alles was Sie tun müssen ist:

@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; 
} 

dann in getMagnitudeFrequencyChart():

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

Danke für die Hilfe, aber es funktioniert nicht. Irgendwie, wenn ich serverEvent erstelle, erhält barChart die heruntergeladenen Daten nicht. – Dominik

+0

@Dominik wird das 'onServerEvent' ausgelöst? –

+0

@Dominik überprüfen Sie auch, dass Sie eine nicht leere Liste erhalten –