我正在使用MPAndroidChart并且非常喜欢它。
我的一个“小”需求是我可以将空值放入“条目”。我正在监视我系统服务器上的 apache 连接,我想看看它们是否已关闭(我放置空值的位置)或者它们是否只是没有连接 (0)。
我试过了,但是 Entry 类不接受“null”作为显示消息的值:“构造函数 Entry(null, int) is undefined”
谢谢!
我正在使用MPAndroidChart并且非常喜欢它。
我的一个“小”需求是我可以将空值放入“条目”。我正在监视我系统服务器上的 apache 连接,我想看看它们是否已关闭(我放置空值的位置)或者它们是否只是没有连接 (0)。
我试过了,但是 Entry 类不接受“null”作为显示消息的值:“构造函数 Entry(null, int) is undefined”
谢谢!
您可能的解决方案可能是检查您收到的对象是否为 null 的天气。如果对象为空,您甚至不创建Entry
对象,而只是将其值设置为空。
例子:
// array that contains the information you want to display
ConnectionHolder[] connectionHolders = ...;
ArrayList<Entry> entries = new ArrayList<Entry>();
int cnt = 0;
for(ConnectionHolder ch : connectionHolders) {
if(ch != null) entries.add(new Entry(ch.getNrOfConnections(), cnt));
else {
// do nothing
}
cnt++; // always increment
}
这将创建例如在对象为空LineChart
的索引上没有绘制圆圈的情况。ConnectionHolder
对于该库的未来版本,我将尝试添加该功能以支持空值。
我的解决方案是绘制另一个具有透明(或任意)颜色的数据集: - 具有固定数量 X 值的图表 - 定期更新 Y 值 - 布尔标志表示透明部分(或其他颜色)
private static final int SERIES_SIZE = 360;
int xIndex = -1;
float xIndexVal;
private LineChart chart;
private boolean currentFlag;
public void createChart(LineDataSet dataSet) {
LineData chartData = new LineData();
prepareDataSet(dataSet);
chartData.addDataSet(dataSet);
for (int i = 0; i < SERIES_SIZE; i++) {
chartData.addXValue("" /*+ i*/);
}
chart.setData(chartData);
}
private void prepareDataSet(LineDataSet dataSet, YAxis axis, int color) {
// configure set
}
public void update(Float val, boolean flag) {
List<ILineDataSet> dsl = chart.getData().getDataSets();
Log.d("chart", String.format("%s --- %d sets, index %d", descr, dsl.size(), xIndex));
if (xIndex == SERIES_SIZE - 1) {
// remove all entries at X index 0
for (int i = 0; i < chart.getData().getDataSetCount(); i++) {
Entry entry0 = chart.getData().getDataSetByIndex(i).getEntryForIndex(0);
if (entry0 != null && entry0.getXIndex() == 0) {
chart.getData().removeEntry(entry0, i);
Log.d("chart", String.format("entry 0 removed from dataset %d, %d entries in the set", i, chart.getData().getDataSetByIndex(i).getEntryCount()));
}
else {
Log.d("chart", String.format("all %d entries in the set kept", chart.getData().getDataSetByIndex(i).getEntryCount()));
}
}
// remove empty set, if any
for (Iterator<ILineDataSet> mit = dsl.iterator(); mit.hasNext(); ) {
if (mit.next().getEntryCount() == 0) {
mit.remove();
Log.d("chart", String.format("set removed, %d sets", dsl.size()));
}
}
// move all entries by -1
for (ILineDataSet ds : dsl) {
for (Entry entry : ((LineDataSet)ds).getYVals()) {
entry.setXIndex(entry.getXIndex() - 1);
}
}
}
else {
xIndex++;
}
if (currentFlag != flag) {
currentFlag = !currentFlag;
LineDataSet set = new LineDataSet(null, "");
prepareDataSet(set, chart.getAxisLeft(), currentFlag ? Color.TRANSPARENT : Color.BLUE);
chart.getData().addDataSet(set);
if (xIndex != 0) {
chart.getData().addEntry(new Entry(xIndexVal, xIndex - 1), dsl.size() - 1);
}
}
xIndexVal = val;
chart.getData().addEntry(new Entry(val, xIndex), dsl.size() - 1);
chart.notifyDataSetChanged();
chart.invalidate();
}