Линия MpAndroidChart не отображается правильно в первый раз - PullRequest
1 голос
/ 21 марта 2019

У меня проблема с MPAndroidChart. У меня есть RecyclerView с LineChart внутри CardView как элемент. RecyclelerView находится внутри фрагмента. В первый раз, когда я показываю фрагмент, линейный график не отображается правильно при первом отображении. И я попытался удалить и показать фрагмент снова. Ширина линии и радиус окружности в первом шоу примерно в два раза меньше, чем во втором, и много раз после. А иногда круги на первом показе вообще не рисуются. И это происходит только тогда, когда приложение запускается с самого начала. Диаграмма очень простая, с меньшим количеством свойств, поэтому я не могу выяснить причину.

Изображение, впервые показывающее

Изображение во второй раз показывает

Вид линейного графика 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...