Разница между BarEntry и RadarEntry при асинхронном добавлении в DataSet - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над двумя различными диаграммами, одна из них - RadarChart, которая сравнивает оценки всех «категорий» в «оценке» с другими «оценками», и сгруппированная BarChart, которая позволяет пользователю выбирать «категории» в«оценка» и сравнить их с другими «оценками».Данные извлекаются из Firebase и DatabaseReferences сохраняются в ArrayList.Мой RadarChart использует следующий код и отображает следующий результат:

        ArrayList<RadarDataSet> dataSets = new ArrayList<>();
        ArrayList<IRadarDataSet> allDataSets = new ArrayList<>();
        for(int i = 0; i < assessmentKeys.size(); i++) {
            final ArrayList<RadarEntry> radarEntries = new ArrayList<>();
            final int trackerIndex = i;
            dataSets.add(trackerIndex, new RadarDataSet(radarEntries, assessmentName.get(i)) );
            mAssessmentCategoryRefs.get(i).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()) {
                        for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                            Category category = postSnapshot.getValue(Category.class);
                            radarEntries.add(new RadarEntry((float)category.getCategoryScore(), category.getNumber() - 1));
                        }
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
            Random random = new Random();
            int randomR = random.nextInt(256);
            int randomG = random.nextInt(256);
            int randomB = random.nextInt(256);
            dataSets.get(trackerIndex).setColor(Color.rgb(randomR, randomG, randomB));
            dataSets.get(trackerIndex).setFillColor(Color.rgb(randomR, randomG, randomB));
            dataSets.get(trackerIndex).setDrawFilled(true);
            allDataSets.add(dataSets.get(trackerIndex));
        }

        RadarData data = new RadarData(allDataSets);

1

Потому что RadarEntry, BarEntry, BarDataSet, RadarDataSet, IBarDataSetи IRadarDataSet все совместно используют родительские классы между ними, я предполагал, что смогу загружать данные в сгруппированную BarChart таким же образом, как я это делал с RadarChart.Для подтверждения концепции я использовал следующий код, чтобы убедиться, что он будет работать, прежде чем пытаться извлечь из Firebase:

        final ArrayList<BarDataSet> dataSets = new ArrayList<>();
            ArrayList<IBarDataSet> allDataSets = new ArrayList<>();

            for(int j = 0; j < assessmentKeys.size(); j++ ) {
                final int jTracker = j;
                final ArrayList<BarEntry> entries = new ArrayList<>();
                dataSets.add(j, new BarDataSet(entries, assessmentName.get(j)));
                Log.d("Received_Data", "Getting data for " + assessmentName.get(j));

                for(int k = 0; k < categoryNames.size(); k++) {
                    entries.add(new BarEntry(k, k+1));
                }

                Random random = new Random();
                int randomR = random.nextInt(256);
                int randomG = random.nextInt(256);
                int randomB = random.nextInt(256);
                dataSets.get(j).setColor(Color.rgb(randomR, randomG, randomB));
                allDataSets.add(dataSets.get(j));
            }

Это привело к созданию этой диаграммы: 2

Когда я добавляюкод, извлекаемый из firebase, происходит нечто странное, чего не происходит с RadarChart:

            final ArrayList<BarDataSet> dataSets = new ArrayList<>();
            ArrayList<IBarDataSet> allDataSets = new ArrayList<>();

            for(int j = 0; j < assessmentKeys.size(); j++ ) {
                final int jTracker = j;
                final ArrayList<BarEntry> entries = new ArrayList<>();
                dataSets.add(j, new BarDataSet(entries, assessmentName.get(j)));
                Log.d("Received_Data", "Getting data for " + assessmentName.get(j));

                for(int k = 0; k < categoryNames.size(); k++) {
                    final String categoryName = categoryNames.get(k);
                    final int kTracker = k;
                    mAssessmentCategoryRefs.get(jTracker).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if(dataSnapshot.exists()) {
                                for(DataSnapshot postSnapShot : dataSnapshot.getChildren()) {
                                    Category category = postSnapShot.getValue(Category.class);
                                    if(categoryName.equals(category.getName())) {
                                        entries.add(new BarEntry(kTracker, (float)category.getCategoryScore()));
                    Log.d(TAG, "Added " + category.getName() + " to entries");
                                    } else {
                    Log.d(TAG, "Skipped " + category.getName());
                    }
                                }
                            }
                        }
                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }
                    });
                }

                Random random = new Random();
                int randomR = random.nextInt(256);
                int randomG = random.nextInt(256);
                int randomB = random.nextInt(256);
                dataSets.get(j).setColor(Color.rgb(randomR, randomG, randomB));
                allDataSets.add(dataSets.get(j));
            }
            BarData data = new BarData(allDataSets);
            mBarChart.setData(data);
            data.notifyDataChanged();
            mBarChart.notifyDataSetChanged();
            mBarChart.invalidate();

3 Данные не отображаются в диаграмме, хотя мои журналы показывают, что они правильно пропускают категории, которые не соответствуют выбранномуимя и добавляет оценку категории, если это так.

В чем причина этого?Сначала я подумал, что это может быть связано с асинхронной природой данных, извлекаемых из базы данных, но если бы это было так, моя RadarChart столкнулась бы с той же проблемой.Насколько я могу судить, единственная реальная разница между RadarEntry и BarEntry заключается в том, что индекс является вторым аргументом в RadarEntry, но первым в BarEntry. Записи загружаются в DataSet втаким же образом DataSet загружаются в ArrayList<IBarDataSet> таким же образом, но по какой-то причине одно работает, а другое - нет.Кто-нибудь знает в чем проблема?Это ошибка с явным MPAndroidChart BarEntry?

1 Ответ

0 голосов
/ 15 февраля 2019

Я нашел работу вокруг.Сначала я должен был создать метод инициализации, который вызывается в onCreate():

    private Map<String, Map<String, Float>> assessmentData = new HashMap<>();
    private void initAssessmentData() {
        for(int i = 0; i < assessmentKeys.size(); i++) {
            final Map<String, Float> categoryNameScore = new HashMap<>();
            mAssessmentCategoryRefs.get(i).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()) {
                        for(DataSnapshot postSnapShot : dataSnapshot.getChildren()) {
                            Category category = postSnapShot.getValue(Category.class);
                            categoryNameScore.put(category.getName(), (float) category.getCategoryScore());
                        }
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
            assessmentData.put(assessmentKeys.get(i), categoryNameScore);
        }
    }

Затем, чтобы поместить данные в график, мне просто нужно было изменить свой код следующим образом:

final ArrayList<BarDataSet> dataSets = new ArrayList<>();
            ArrayList<IBarDataSet> allDataSets = new ArrayList<>();
            final BarData data = new BarData(allDataSets);

            for(int j = 0; j < assessmentKeys.size(); j++ ) {
                final int jTracker = j;
                final ArrayList<BarEntry> entries = new ArrayList<>();
                dataSets.add(j, new BarDataSet(entries, assessmentName.get(j)));
                Log.d("Received_Data", "Getting data for " + assessmentName.get(j));


                for(String key : assessmentData.keySet()) {
                    if(key.equals(assessmentKeys.get(j))) {
                        Map<String, Float> categoryData = assessmentData.get(key);
                        for(String key2 : categoryData.keySet()) {
                            if(categoryNames.contains(key2)) {
                                entries.add(new BarEntry(categoryNames.indexOf(key2), categoryData.get(key2)));
                            }
                        }
                    }
                }

                Random random = new Random();
                int randomR = random.nextInt(256);
                int randomG = random.nextInt(256);
                int randomB = random.nextInt(256);
                dataSets.get(j).setColor(Color.rgb(randomR, randomG, randomB));
                allDataSets.add(dataSets.get(j));
                data.notifyDataChanged();
                mBarChart.notifyDataSetChanged();
                mBarChart.invalidate();

1

...