Theo tôi hiểu, bạn muốn vẽ các thanh dựa trên bunk
nhưng tô màu chúng dựa trên credits
. Sử dụng tập dữ liệu thanh tùy chỉnh là cách tiếp cận phù hợp, chỉ cần sửa đổi một chút. Đoạn mã dưới đây lấy những gì bạn đang mô tả.
Những thay đổi tôi đã thực hiện:
- Không thể chuyển danh sách tên cho
BarData
, hãy sử dụng công cụ định dạng giá trị trục thay thế - Tập dữ liệu thanh tùy chỉnh đã thay đổi để giữ các tín dụng
credits
mảng. Không chắc liệugetEntryForXIndex
của bạn phương thức được định nghĩa ở nơi khác, nhưng nó không có trong mã bạn đã đăng. - Đã xóa các cuộc gọi không dùng nữa và cú pháp không hợp lệ (không thể gọi
setDescription("");
)
Nếu đây không phải là thứ bạn đang tìm kiếm, hãy cập nhật câu hỏi với chi tiết hơn về những gì bạn đang thấy, v.v. Theo như tôi có thể nói câu hỏi là về biểu đồ chứ không phải về cơ sở dữ liệu 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);
}
}
}
CHỈNH SỬA: Nói về cơ sở dữ liệu SQL - không gọi queryXData
và queryYData
bên trong vòng lặp! Thao tác này sẽ trích xuất toàn bộ mảng dữ liệu mỗi lần lặp lại vòng lặp, sau đó một lần nữa bên trong chính vòng lặp (rất tốn kém). Chỉ cần sử dụng một cái gì đó như thế này để thay thế:
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();