У меня проблема с 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());
}