私が理解しているように、あなたはbunk
に基づいてバーをプロットしたいと思います ただし、credits
に基づいて色を付けます 。カスタムバーデータセットを使用するのが正しいアプローチです。少し変更する必要があります。以下のコードは、あなたが説明しているものを取得します。
私が行った変更:
- 名前のリストを
BarData
に渡すことができません 、代わりに軸値フォーマッタを使用してください - カスタムバーデータセットを変更して、
credits
も保持するようにしました 配列。getEntryForXIndex
かどうかわからない メソッドは他の場所で定義されていますが、投稿したコードには含まれていません。 - 非推奨の呼び出しと無効な構文を削除しました(
setDescription("");
を呼び出すことはできません) )
これがあなたが探しているものではない場合は、あなたが見ているものなどについての詳細で質問を更新してください...私が知る限り、質問は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);
}
}
}
編集: SQLデータベースについてはさておき、queryXData
を呼び出さないでください およびqueryYData
ループの内側!これにより、ループの反復ごとにデータ配列全体が抽出され、次にループ自体の内部に抽出されます(非常にコストがかかります)。代わりに次のようなものを使用してください:
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();