Получить данные из пожарной базы Firebase и построить гистограмму, используя высокие графики при нажатии карты - Android - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть действие, в котором есть много представлений карт, при нажатии на которые следует извлечь данные из пожарного магазина Firebase и отобразить данные в формате гистограммы, используя верхние диаграммы в android. На каждом событии щелчка просмотра карты передается d этого просмотра карты.в запросе пожарного депо и извлекаются связанные данные. Но в моем случае представление карты работает только при втором щелчке, а также при нажатии другого представления карты оно сохраняет значение предыдущего запроса и только при втором щелчке показывает правильноеdata.

Ниже приведен мой код для представления адаптера, в котором есть просмотры карт.

   DocumentReference docRef = rootRef.collection("Users").document(tId).collection("Subjects")
                .document(subId).collection("Marks").document(testList.get(position).getMarksID());

           holder.show_graph.setOnClickListener(v -> {

               docRef.get().addOnSuccessListener(documentSnapshot -> {
                   mMarks = new HashSet<>();
                   if (documentSnapshot != null && documentSnapshot.exists()) {
                       Map<String, Object> hm = documentSnapshot.getData();
                       Set<String> a = hm.keySet();
                       for (String b : a) {
                           try {
                               holder.marks_obtained.setText((String)documentSnapshot.get(email));

                               if(!b.equals("Max_marks")){
                                   Log.e( "onComplete: ", documentSnapshot.get(b+".com") + "  " +documentSnapshot.getId() );
                                   mMarks.add(Float.parseFloat((String)documentSnapshot.get(b+".com")));
                               }
                           } catch (Exception e) {
                               e.printStackTrace();
                           }
                       }
                   }
               });

            v = LayoutInflater.from(context).inflate(R.layout.graph_plot,null);
            final View alertLayout = v;

            try{
                //HICharts
                HIChartView chartView =  alertLayout.findViewById(R.id.hc);
                chartView.plugins = new ArrayList<>(Arrays.asList("histogram-bellcurve"));

                HIOptions options = new HIOptions();

                HIChart chart = new HIChart();
                chart.setType("variwide");
                options.setChart(chart);

                HITitle title = new HITitle();
                title.setText("Score Division");
                options.setTitle(title);

                HIXAxis xaxis1 = new HIXAxis();
                HITitle ht = new HITitle();
                ht.setText("Count");
                xaxis1.setTitle(ht);

                HIXAxis xaxis2 = new HIXAxis();
                xaxis2.setTitle(new HITitle());
                xaxis2.setOpposite(true);

                options.setXAxis(new ArrayList<>(Arrays.asList(xaxis1, xaxis2)));

                HIYAxis yaxis1 = new HIYAxis();
                HITitle ht2 = new HITitle();
                ht2.setText("Marks");
                yaxis1.setTitle(ht2);

                HIYAxis yaxis2 = new HIYAxis();
                yaxis2.setTitle(new HITitle());
                yaxis2.setOpposite(true);

                options.setYAxis(new ArrayList<>(Arrays.asList(yaxis1, yaxis2)));

                HILegend legend = new HILegend();
                legend.setEnabled(true);
                options.setLegend(legend);

                HIHistogram series1 = new HIHistogram();
                series1.setType("histogram");
                series1.setName("Histogram");
                series1.setXAxis(1);
                series1.setYAxis(1);
                series1.setBaseSeries("s1");
                series1.setZIndex(-1);

                HIScatter series2 = new HIScatter();
                series2.setType("scatter");
                series2.setName("Data");

                Number[] series2_data = new Number[mMarks.size()];

                int i = 0;
                for(float m : mMarks){
                    series2_data[i] = m;
                    i++;
                }

                series2.setId("s1");
                series2.setData(new ArrayList<>(Arrays.asList(series2_data)));
                series2.setMarker(new HIMarker());
                series2.getMarker().setRadius(2.5);

                options.setSeries(new ArrayList<>(Arrays.asList(series1, series2)));

                options.setExporting(new HIExporting());
                options.getExporting().setEnabled(false);

                chartView.setOptions(options);

                AlertDialog.Builder alertBox = new AlertDialog.Builder(v.getRootView().getContext());
                alertBox.setTitle("Graph");

                alertBox.setView(alertLayout);
                alertBox.setCancelable(false);

                alertBox.setPositiveButton("Done", (dialog, which) -> dialog.dismiss());

                AlertDialog dialog = alertBox.create();
                dialog.show();
            }
            catch (NullPointerException e){
                Log.e("",e.getLocalizedMessage());
            }
            finally {
                if(mMarks != null){
                    mMarks.clear();
                }
            }
        });
    }

1 Ответ

0 голосов
/ 04 октября 2018

Как отметил @daniel_s, проблема не в старших чартах.И это не проблема с firebase тоже.Это то, как вы поместили свой код.

Теперь я не тот человек, который может говорить что-либо о firebase, но давайте поймем это.Firebase работает по асинхронному механизму, и все методы firebase имеют асинхронный тип.Поэтому, когда вы нажимаете на Cardview, и метод firebase, и метод старшей диаграммы запускаются вместе, а не один за другим.

Чтобы сделать эту работу в соответствии с вашим способом, вы должны сделать что-то вроде этого:

holder.show_graph.setOnClickListener(v -> {

               docRef.get().addOnSuccessListener(documentSnapshot -> {
                   mMarks = new HashSet<>();
                   if (documentSnapshot != null && documentSnapshot.exists()) {
                       Map<String, Object> hm = documentSnapshot.getData();
                       Set<String> a = hm.keySet();
                       for (String b : a) {
                           try {
                               holder.marks_obtained.setText((String)documentSnapshot.get(email));

                               if(!b.equals("Max_marks")){
                                   Log.e( "onComplete: ", documentSnapshot.get(b+".com") + "  " +documentSnapshot.getId() );
                                   mMarks.add(Float.parseFloat((String)documentSnapshot.get(b+".com")));
                               }
                           } catch (Exception e) {
                               e.printStackTrace();
                           }
                       }
            // All of your highcharts code here.....
            v = LayoutInflater.from(context).inflate(R.layout.graph_plot,null);
            final View alertLayout = v;

            try{
                //HICharts
                HIChartView chartView =  alertLayout.findViewById(R.id.hc);
                chartView.plugins = new ArrayList<>(Arrays.asList("histogram-bellcurve"));

                HIOptions options = new HIOptions();

                HIChart chart = new HIChart();
                chart.setType("variwide");
                options.setChart(chart);

                HITitle title = new HITitle();
                title.setText("Score Division");
                options.setTitle(title);

                HIXAxis xaxis1 = new HIXAxis();
                HITitle ht = new HITitle();
                ht.setText("Count");
                xaxis1.setTitle(ht);

                HIXAxis xaxis2 = new HIXAxis();
                xaxis2.setTitle(new HITitle());
                xaxis2.setOpposite(true);

                options.setXAxis(new ArrayList<>(Arrays.asList(xaxis1, xaxis2)));

                HIYAxis yaxis1 = new HIYAxis();
                HITitle ht2 = new HITitle();
                ht2.setText("Marks");
                yaxis1.setTitle(ht2);

                HIYAxis yaxis2 = new HIYAxis();
                yaxis2.setTitle(new HITitle());
                yaxis2.setOpposite(true);

                options.setYAxis(new ArrayList<>(Arrays.asList(yaxis1, yaxis2)));

                HILegend legend = new HILegend();
                legend.setEnabled(true);
                options.setLegend(legend);

                HIHistogram series1 = new HIHistogram();
                series1.setType("histogram");
                series1.setName("Histogram");
                series1.setXAxis(1);
                series1.setYAxis(1);
                series1.setBaseSeries("s1");
                series1.setZIndex(-1);

                HIScatter series2 = new HIScatter();
                series2.setType("scatter");
                series2.setName("Data");

                Number[] series2_data = new Number[mMarks.size()];

                int i = 0;
                for(float m : mMarks){
                    series2_data[i] = m;
                    i++;
                }

                series2.setId("s1");
                series2.setData(new ArrayList<>(Arrays.asList(series2_data)));
                series2.setMarker(new HIMarker());
                series2.getMarker().setRadius(2.5);

                options.setSeries(new ArrayList<>(Arrays.asList(series1, series2)));

                options.setExporting(new HIExporting());
                options.getExporting().setEnabled(false);

                chartView.setOptions(options);

                AlertDialog.Builder alertBox = new AlertDialog.Builder(v.getRootView().getContext());
                alertBox.setTitle("Graph");

                alertBox.setView(alertLayout);
                alertBox.setCancelable(false);

                alertBox.setPositiveButton("Done", (dialog, which) -> dialog.dismiss());

                AlertDialog dialog = alertBox.create();
                dialog.show();
            }
            catch (NullPointerException e){
                Log.e("",e.getLocalizedMessage());
            }
            finally {
                if(mMarks != null){
                    mMarks.clear();
                }
            }
                   }
               });

Надеюсь, мне было ясно.Если это сработало, то примите мой ответ, нажав на галочку:)

...