MpAndroidChart线不能在第一次正确绘制

时间:2019-03-20 22:43:37

标签: android mpandroidchart linechart

MPAndroidChart出现问题。 我有一个带有CardChar内的LineChart的RecyclerView项。 recyclerView位于片段中。第一次显示片段时,第一次显示的折线图绘制不正确。我尝试删除并再次显示该片段。第一个节目中的线宽和圆半径是第二个节目的一半,此后的很多倍。有时,第一次显示中的圆圈根本没有画出来。而且只有在应用程序从头开始时才会发生。该图表非常基本,属性较少,因此我无法找出原因。

The image first time showing

The image second time showing

折线图视图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());
}

1 个答案:

答案 0 :(得分:0)

请务必致电

Utils.init(context)

在设置线宽之前至少一次。

例如,在应用程序的onCreate()方法中。

setLineWidth方法需要具有设备的指标。 为此,它使用Utils类,但是如果未初始化,它将返回您的值而无需应用转换。

发生这种情况时实际上会记录一个错误:

  

E / MPChartLib-Utils:未初始化的实用程序。在调用Utils.convertDpToPixel(...)之前,您至少需要调用Utils.init(...)。否则转换不会发生。