我在使用 MPAndroidChart 时遇到问题。 我有一个 RecyclerView,其中 CardView 中的 LineChart 作为一个项目。 recyclerView 位于 fragment 内。我第一次显示 fragment 时,折线图在第一次显示时没有正确绘制。我试图删除并再次显示该 fragment 。第一次展示中的线宽和圆半径与第二次和之后的许多次相比就像一半大小。有时第一次展示的圆圈根本就没有画出来。而且只有当应用程序从头开始时才会发生。该图表非常基础,属性较少,因此我找不到原因。
折线图 View xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="240dp"
android:layout_margin="8dp"
app:cardCornerRadius="5dp">
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/line_chart"
android:layout_margin="8dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v7.widget.CardView>
初始化图表折线数据的函数:
public void initChartData() {
this.lineDataSet = new LineDataSet(entries, title);
lineDataSet.setDrawCircles(true);
lineDataSet.setColor(Color.RED);
lineDataSet.setCircleColor(Color.RED);
lineDataSet.setDrawIcons(false);
// line thickness and point size
lineDataSet.setCircleRadius(2f);
lineDataSet.setLineWidth(1f);
// draw points as solid circles
lineDataSet.setDrawCircleHole(false);
// customize legend entry
lineDataSet.setFormLineWidth(1f);
//lineDataSet.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
lineDataSet.setFormSize(15.f);
lineDataSet.setValueTextSize(9f);
lineDataSet.setDrawValues(false);
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(lineDataSet);
this.data = new LineData(dataSets);
}
图表ViewHolder:
public ChartItemViewHolder(@NonNull View itemView) {
super(itemView);
this.view = itemView;
lineChart = view.findViewById(R.id.line_chart);
lineChart.clearAllViewportJobs();
lineChart.clear();
lineChart.setBackgroundColor(Color.WHITE);
lineChart.getDescription().setEnabled(false);
lineChart.setTouchEnabled(true);
lineChart.setDrawGridBackground(false);
lineChart.setDragEnabled(true);
lineChart.setScaleEnabled(true);
lineChart.setPinchZoom(false);
lineChart.getAxisRight().setEnabled(false);
lineChart.setExtraBottomOffset(8);
Legend l = lineChart.getLegend();
l.setForm(Legend.LegendForm.LINE);
}
适配器:
@Override
public void onBindViewHolder(@NonNull final ChartItemViewHolder chartItemViewHolder, int i) {
chartItemViewHolder.item = itemList.get(i);
chartItemViewHolder.lineChart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return CommonUtils.toTimeString((long) value+chartItemViewHolder.item.getRefTimeStamp());
}
});
chartItemViewHolder.lineChart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "CLICKED", Toast.LENGTH_SHORT).show();
}
});
chartItemViewHolder.lineChart.clear();
chartItemViewHolder.lineChart.setData(chartItemViewHolder.item.getLineData());
}
最佳答案
一定要打电话
Utils.init(context)
在设置线宽之前至少一次。
例如在您的应用程序的 onCreate() 方法中。
setLineWidth 方法需要有设备的指标。 它为此目的使用 Utils 类,但如果它未初始化,它会在不应用转换的情况下返回您的值。
发生这种情况时实际上会记录一个错误:
E/MPChartLib-Utils: Utils NOT INITIALIZED. You need to call Utils.init(...) at least once before calling Utils.convertDpToPixel(...). Otherwise conversion does not take place.
关于android - MpAndroidChart Line 第一次绘制不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55271232/