MPAndroidChart无法向PieEntry添加数据 运行结果与预期不符如何解决
问题根因及修复方案
1. 布局参数错误导致显示区域异常
你的XML布局给PieChart设置了过大的上下左右margin(顶部287dp、底部391dp、左右合计304dp),普通手机屏幕尺寸无法承载这么大的边距,会直接把饼图的可用显示区域挤压到几乎不可见,导致看不到数据。
修复方案:把冗余边距删除,调整为合理参数即可,示例如下:
<com.github.mikephil.charting.charts.PieChart android:id="@+id/pieChart" android:layout_above="@+id/bottom_navi" android:layout_width="match_parent" android:layout_height="300dp" android:layout_marginHorizontal="16dp" android:layout_marginTop="24dp" />
2. 图表刷新顺序错误
你在设置完数据后立刻调用了pieChart.invalidate()刷新,后续配置的所有图表属性都不会触发重绘,导致配置不生效。invalidate()需要放在所有属性配置的最后一步执行。
3. 可选优化项
- 你使用的HashMap是无序存储结构,遍历key的顺序不固定,可能导致分类和颜色的匹配顺序和预期不一致,可替换为LinkedHashMap保证插入顺序。
- 开启
setUsePercentValues(true)后最好配套设置百分比格式化器,避免显示的数值小数过长影响观感。
修复后完整代码
private void ShowPieChart() { ArrayList<PieEntry> pieEntries = new ArrayList<>(); String label = "type"; // 改用LinkedHashMap保证分类顺序和插入一致 Map<String, Integer> typeAmountMap = new LinkedHashMap<>(); typeAmountMap.put("Toys",200); typeAmountMap.put("Snacks",230); typeAmountMap.put("Clothes",100); typeAmountMap.put("Stationary",500); typeAmountMap.put("Phone",50); ArrayList<Integer> colors = new ArrayList<>(); colors.add(Color.parseColor("#304567")); colors.add(Color.parseColor("#309967")); colors.add(Color.parseColor("#476567")); colors.add(Color.parseColor("#890567")); colors.add(Color.parseColor("#a35567")); colors.add(Color.parseColor("#ff5f67")); colors.add(Color.parseColor("#3ca567")); for(String type: typeAmountMap.keySet()){ pieEntries.add(new PieEntry(typeAmountMap.get(type).floatValue(), type)); } PieDataSet pieDataSet = new PieDataSet(pieEntries,label); pieDataSet.setValueTextSize(12f); pieDataSet.setColors(colors); PieData pieData = new PieData(pieDataSet); pieData.setDrawValues(true); // 配置百分比格式化规则 pieData.setValueFormatter(new PercentFormatter(pieChart)); // 先配置所有图表属性 pieChart.setUsePercentValues(true); pieChart.getDescription().setEnabled(false); pieChart.setRotationEnabled(true); pieChart.setDragDecelerationFrictionCoef(0.9f); pieChart.setRotationAngle(0); pieChart.setHighlightPerTapEnabled(true); pieChart.setHoleColor(Color.parseColor("#000000")); pieChart.getLegend().setEnabled(true); // 最后设置数据、启动动画、刷新视图 pieChart.setData(pieData); pieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad); pieChart.invalidate(); }
内容的提问来源于stack exchange,提问作者hellowin
相关产品推荐
相关产品推荐

