需求:显示最近20条的数据,而且500毫秒秒刷新一次,每次都要求数据最新。
解决办法:
使用List储存,每次存储在下标为0的位置,当list长度大于20时,删除第20位即可。需要注意的是(为了时刻展示最新数据,我们将数据存在下标为0的位置,但是要记得遍历list,同步x轴位置)
布局界面
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.github.mikephil.charting.charts.BarChart android:id="@+id/chart" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
public class MainActivity extends AppCompatActivity { private BarChart chart; private List<BarEntry> list = new ArrayList<>(); private CountDownTimer count; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); chart = findViewById(R.id.chart); info(); } private void info() { XAxis xAxis = chart.getXAxis(); //取消x轴网格线 xAxis.setDrawGridLines(false); //设置x轴位置 xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //设置x轴显示标签数 xAxis.setLabelCount(25); //定义x轴最大值 xAxis.setAxisMaximum(25f); //禁用图表右边Y轴 chart.getAxisRight().setEnabled(false); //取消图表左边y轴网格线 chart.getAxisLeft().setDrawGridLines(false); //x轴标签集合,i的大小与自定义的最大值关联。 final List<String> list = new ArrayList<>(); for (int i = 0; i < 20; i ++) { list.add("" + i); } //自定义x轴标签 xAxis.setValueFormatter(new IAxisValueFormatter() { @Override public String getFormattedValue(float value, AxisBase axis) { Log.e("demo", String.valueOf(value)); if (value > 19) { return ""; } else { return list.get((int) value); } } }); //取消图例显示 chart.getLegend().setEnabled(false); //取消描述显示 Description description = new Description(); description.setEnabled(false); chart.setDescription(description); //开启定时器 count = new CountDownTimer(Integer.MAX_VALUE, 500) { @Override public void onTick(long millisUntilFinished) { setData((int) (Math.random() * 80)); } @Override public void onFinish() { } }.start(); } private void setData(int k) { //每次存储在下标为0的位置 list.add(0, new BarEntry(0, k)); //更改x轴的下标 for (int i = 0; i < list.size(); i++) { list.get(i).setX(i); } //条目大于20时,删除最后的条目 if (list.size() > 20) { list.remove(20); } BarDataSet set = new BarDataSet(list, ""); BarData data = new BarData(set); data.setBarWidth(0.6f); chart.setData(data); //刷新布局 chart.invalidate(); } @Override protected void onStop() { super.onStop(); if(count!=null){ count.cancel(); count=null; } } }
代码如上,相应的注释也在上面,注意上面的setData并没有优化,这里只是为了演示效果。
效果图
最后,写一下自定义x轴的一些注意事项
1. x轴标签的位置与自定义x轴最大值相关,比如上面代码里设置了最大长度为25f,但是在给List<Entry>里面添加数据时,我们的 i 最大也就是19,所以产生了x轴有一部分是空白的原因。
2. 标签数的定义,利用 xAxis.setLabelCount(25) 设置了显示25个标签,但是这个数字并不是固定,这里 注意一下上面代码里 打印的 Log,它会执行你设置的标签数次(不一定),如果一定要准确,需要加上 true,精准计数。