Я работаю над двумя различными диаграммами, одна из них - 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);
Потому что 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));
}
Это привело к созданию этой диаграммы:
Когда я добавляюкод, извлекаемый из 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();
Данные не отображаются в диаграмме, хотя мои журналы показывают, что они правильно пропускают категории, которые не соответствуют выбранномуимя и добавляет оценку категории, если это так.
В чем причина этого?Сначала я подумал, что это может быть связано с асинхронной природой данных, извлекаемых из базы данных, но если бы это было так, моя RadarChart столкнулась бы с той же проблемой.Насколько я могу судить, единственная реальная разница между RadarEntry
и BarEntry
заключается в том, что индекс является вторым аргументом в RadarEntry
, но первым в BarEntry
. Записи загружаются в DataSet
втаким же образом DataSet
загружаются в ArrayList<IBarDataSet>
таким же образом, но по какой-то причине одно работает, а другое - нет.Кто-нибудь знает в чем проблема?Это ошибка с явным MPAndroidChart
BarEntry
?