我在 Android 应用程序中使用 MPAndroidChart 来显示从 API 获取的条形图。但是,我面临几个问题:
重叠条: 我的条形图中的条形重叠,我想确保它们间隔适当。
X 轴标签未正确显示: 代表月份和年份的 X 轴标签未正确显示。它不显示实际标签,而是显示数值(0.0、1.0、2.0...)。
动态设置Y轴最大值: 我想根据从 API 收到的最大值动态设置 Y 轴上的最大值。 这是我现有代码的简化版本:
// ... (existing imports)
public class MainActivity extends AppCompatActivity {
private BarChart barChart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
barChart = findViewById(R.id.barChart);
new FetchDataTask().execute("http://sms1.ilmwasooli.com/dashboard/getcollechistorytest");
}
private void updateUI(String data) {
try {
// Parse JSON data
JSONObject jsonResponse = new JSONObject(data);
String status = jsonResponse.getString("status");
if (status.equals("success")) {
JSONArray dataArray = jsonResponse.getJSONArray("Data");
// Extract values for the bar chart
ArrayList<BarEntry> entriesReceived = new ArrayList<>();
ArrayList<BarEntry> entriesBalance = new ArrayList<>();
ArrayList<String> labels = new ArrayList<>();
float maxAmount = 0f;
for (int i = 0; i < dataArray.length(); i++) {
JSONObject monthData = dataArray.getJSONObject(i);
String monthYear = monthData.getString("mnth") + " " + monthData.getString("year");
float receivedValue = (float) monthData.getDouble("rcvd");
float balanceValue = (float) monthData.getDouble("bal");
maxAmount = Math.max(maxAmount, Math.max(receivedValue, balanceValue));
entriesReceived.add(new BarEntry(i, receivedValue));
entriesBalance.add(new BarEntry(i, balanceValue));
labels.add(monthYear);
}
BarDataSet dataSetReceived = new BarDataSet(entriesReceived, "Received Amount");
dataSetReceived.setColor(getResources().getColor(R.color.primary_color_light));
BarDataSet dataSetBalance = new BarDataSet(entriesBalance, "Balance Amount");
dataSetBalance.setColor(getResources().getColor(R.color.primary_color_dark));
BarData barData = new BarData(dataSetReceived, dataSetBalance);
barChart.setData(barData);
XAxis xAxis = barChart.getXAxis();
xAxis.setValueFormatter(new MyXAxisValueFormatter(labels));
xAxis.setLabelRotationAngle(45f);
YAxis yAxis = barChart.getAxisLeft();
yAxis.setAxisMaximum(maxAmount);
barChart.invalidate();
} else {
Toast.makeText(MainActivity.this, "Failed to fetch data", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
// ... (existing classes and methods)
}