いつもお世話になっております。
Android Studioにて家計簿アプリを作成しております。
その中で、データベースから日別の支出金額を取得し、日別で棒グラフを作成しようとしております。
(MPAndroidChartを利用)
イメージとして、以下のような棒グラフを表示する事が目標です。
(x軸:日付 y軸:金額。図はExcelにて作成したグラフです。)
ところが、MPAndroidChartで作成したグラフは以下のようになります。
AndroidStudioで作成したx軸のラベルは、棒グラフに1対1で対応しておらず
1本の棒グラフに対して同じ日付のラベルが複数表示されております。
Java
1public class AnalysisKodukaiByDate extends AppCompatActivity { 2 3 //バーチャートフィールド 4 BarChart barChart; 5 List<BarEntry> barEntryList; 6 List<List<String>> barList; 7 List<String> barXAxisList; 8 BarDataSet barDataSet; 9 10 BarData barData; 11 12 //データベース関係 13 private DatabaseHelper _helper; 14 private static final String TABLE_NAME = "catkakeibopayment"; 15 private Cursor cursorTotal; 16 private Cursor cursor; 17 private String[] from; 18 private static final int[] to = {R.id.itemName, R.id.amount, R.id.percent}; 19 private SimpleCursorAdapter adapter; 20 int totalIndex = 0; 21 String total; 22 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.activity_analysis_kodukai_by_date); 27 28 //日付でグループ化し、支出金額を合計するSQL文 29 String selectByDate = "SELECT _id, date, SUM(amount) AS total, ROUND(CAST(SUM(amount) AS REAL) / CAST((SELECT SUM(amount) FROM " + TABLE_NAME + " WHERE date BETWEEN '" + fromDate + "' AND '" + toDate + "') AS REAL) * 100, 1) AS per FROM (SELECT * FROM " + TABLE_NAME + " WHERE date BETWEEN '" + fromDate + "' AND '" + toDate + "') GROUP BY date ORDER BY date ASC;"; 30 31 //データベースに接続し、select文を発行。 32 _helper = new DatabaseHelper(AnalysisKodukaiByDate.this); 33 SQLiteDatabase db = _helper.getWritableDatabase(); 34 35 cursor = db.rawQuery(selectByDate, null); 36 37 //barchart準備 38 barChart = (BarChart) findViewById(R.id.analysisBarChart); 39 barEntryList = new ArrayList<>(); 40 barListSon = new ArrayList<>(); 41 barXAxisList = new ArrayList<>(); 42 43 //SQL結果をループして取得しリストに格納。なお、cursorには_idも含まれる為、indexの数字に注意。 44 int i = 0; 45 while(cursor.moveToNext()) { 46 barEntryList.add(new BarEntry(i, Integer.parseInt(cursor.getString(2)))); 47 barXAxisList.add(cursor.getString(1)); 48 i ++; 49 } 50 51 //グラフの設定 52 barChart.getLegend().setEnabled(true); 53 XAxis xAxis = barChart.getXAxis(); 54 xAxis.setDrawLabels(true); 55 xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); 56 xAxis.setDrawGridLines(false); 57 xAxis.setLabelCount(7, true); 58 xAxis.setValueFormatter(new MyValueFormatter(barChart, barXAxisList)); 59 60 //グラフにデータ格納 61 barDataSet = new BarDataSet(barEntryList, analysisRule); 62 barDataSet.setColors(ColorTemplate.COLORFUL_COLORS); 63 64 barData = new BarData(barDataSet); 65 barData.setValueTextSize(12f); 66 67 barChart.setData(barData); 68 barChart.invalidate(); 69 } 70 71 //グラフのX軸フォーマッタークラス 72 public class MyValueFormatter extends ValueFormatter { 73 private final BarChart chart; 74 private final List<String> barXAxisList; 75 76 public MyValueFormatter(BarChart chart, List<String> barXAxisList) { 77 this.chart = chart; 78 this.barXAxisList = barXAxisList; 79 } 80 @Override 81 public String getFormattedValue(float value) { 82 return ""; 83 } 84 85 @Override 86 public String getAxisLabel(float value, AxisBase axis) { 87 String date = barXAxisList.get((int) value).substring(5,10); 88 return date; 89 }
以下サイトを読み、公式ドキュメントも読んでみたのですが、
サンプルで当たり前に実現していることが自分には出来ず、打開できずにおります。
https://qiita.com/c60evaporator/items/14e63d22d860b73e6f22
https://moneyforward.com/engineers_blog/2015/10/20/mpandroidchart/
https://github.com/PhilJay/MPAndroidChart
何か根本的に分かっておらず、解決出来ないのではないかと思います。
上記の図やコードから、誤っている部分等ご教示頂けないでしょうか。
お手数ですが、どうぞ宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/22 04:10 編集
2021/08/22 10:29
2021/08/22 11:17
2021/08/24 11:34
2021/08/24 13:01