Seperti yang saya pahami, Anda ingin memplot bilah berdasarkan bunk
tetapi warnai berdasarkan credits
. Menggunakan dataset bilah kustom adalah pendekatan yang tepat, hanya perlu sedikit memodifikasinya. Kode di bawah mendapatkan apa yang Anda gambarkan.
Perubahan yang saya buat:
- Tidak dapat meneruskan daftar nama ke
BarData
, gunakan pemformat nilai sumbu sebagai gantinya - Mengubah kumpulan data bilah khusus untuk menyimpan
credits
Himpunan. Tidak yakin apakahgetEntryForXIndex
your Anda metode didefinisikan di tempat lain, tetapi tidak ada dalam kode yang Anda posting. - Panggilan yang tidak digunakan lagi dan sintaks yang tidak valid telah dihapus (tidak dapat memanggil
setDescription("");
)
Jika ini bukan yang Anda cari, perbarui pertanyaan dengan lebih detail tentang apa yang Anda lihat dll... Sejauh yang saya tahu pertanyaannya adalah tentang bagan dan bukan tentang database SQL.
@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: Selain tentang database SQL - jangan panggil queryXData
dan queryYData
di dalam lingkaran! Ini akan mengekstrak seluruh array data setiap iterasi loop, lalu lagi di dalam loop itu sendiri (sangat mahal). Cukup gunakan sesuatu seperti ini sebagai gantinya:
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();