Som jag förstår det vill du plotta staplarna baserat på bunk
men färglägg dem baserat på credits
. Att använda den anpassade stapeldatauppsättningen är rätt tillvägagångssätt, behöver bara ändra det lite. Koden nedan får det du beskriver.
Ändringar jag gjort:
- Kan inte skicka namnlistan till
BarData
, använd en axelvärdesformaterare istället - Ändrade anpassad stapeldatauppsättning till att även innehålla
credits
array. Inte säker på om dittgetEntryForXIndex
Metoden är definierad på annat håll, men den finns inte i koden du postade. - Ta bort föråldrade anrop och ogiltig syntax (kan inte anropa
setDescription("");
)
Om detta inte är vad du letar efter, uppdatera frågan med mer detaljerad information om vad du ser osv... Så vitt jag kunde förstå handlade frågan om diagrammet och inte om SQL-databasen.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BarChart chart = findViewById(R.id.test_chart);
// Some made up data - replace these with your
// queryYdata, queryXdata, and queryZdata methods
String[] names = new String[]{"foo","bar","fiz","bam","boo"};
List<Float> credits = new ArrayList<>(Arrays.asList(1f,9f,2.5f,15f,50f));
float[] bunks = new float[]{10f,15f,16f,20f,5f};
List<BarEntry> entries = new ArrayList<>();
for(int i = 0; i < bunks.length; ++i) {
entries.add(new BarEntry(i, bunks[i]));
}
float textSize = 16f;
MyBarDataset dataSet = new MyBarDataset(entries, "data", credits);
dataSet.setColors(ContextCompat.getColor(this,R.color.green),
ContextCompat.getColor(this,R.color.yellow),
ContextCompat.getColor(this,R.color.red));
BarData data = new BarData(dataSet);
data.setDrawValues(false);
data.setBarWidth(0.9f);
chart.setData(data);
chart.setFitBars(true);
chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(names));
chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
chart.getXAxis().setTextSize(textSize);
chart.getAxisLeft().setTextSize(textSize);
chart.setExtraBottomOffset(10f);
chart.getAxisRight().setEnabled(false);
Description desc = new Description();
desc.setText("");
chart.setDescription(desc);
chart.getLegend().setEnabled(false);
chart.getXAxis().setDrawGridLines(false);
chart.getAxisLeft().setDrawGridLines(false);
chart.invalidate();
}
public class MyBarDataset extends BarDataSet{
private List<Float> credits;
MyBarDataset(List<BarEntry> yVals, String label, List<Float> credits) {
super(yVals, label);
this.credits = credits;
}
@Override
public int getColor(int index){
float c = credits.get(index);
if (c < 8){
return mColors.get(0);
}
else if (c < 13) {
return mColors.get(1);
}
else {
return mColors.get(2);
}
}
}
EDIT: En sida om SQL-databasen - anrop inte queryXData
och queryYData
inne i slingan! Detta kommer att extrahera hela datamatrisen varje loopiteration, sedan igen inuti själva loopen (mycket dyrt). Använd bara något sånt här istället:
ArrayList<BarEntry> yVals = new ArrayList<>();
ArrayList<Integer> yData = myhelper.queryYdata();
for (int i=0; i<yData.size(); i++){
yVals.add(new BarEntry(i,yData.get(i)));
}
ArrayList<String> xData = myhelper.queryXdata();