【问题标题】:MPAndroidChart with null values具有空值的 MPAndroidChart
【发布时间】:2014-08-15 14:22:04
【问题描述】:

我正在使用MPAndroidChart 并且非常喜欢它。

我的一个“小”需求是我可以将空值放入“条目”。我正在监视我系统服务器上的 apache 连接,我想看看它们是否已关闭(我放置空值的位置)或者它们是否只是没有连接 (0)。

我试过了,但是 Entry 类不接受 'null' 作为显示消息的值:'The constructor Entry(null, int) is undefined'

谢谢!

【问题讨论】:

标签: android charts mpandroidchart


【解决方案1】:

您可能的解决方案是检查您收到的对象是否为空。如果对象为 null,您甚至不需要创建 Entry 对象,而只是将其值设置为 null。

例子:

// 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 对象为空的索引上绘制圆圈。

对于该库的未来版本,我将尝试添加该功能以支持空值。

【讨论】:

  • 感谢您的回答,但不起作用......他只是在两点之间划了一条“大线”......我需要这个空点显示一个空白空间。所以,虽然你支持这个,但我会尝试用不同的颜色做一个圆圈.. 有可能,好吗?你希望我在 github 上发布问题吗?
  • 没错,它不起作用。我正在发送正确的 xIndex 和相应的值,它在 xIndex 之间画了一条线
【解决方案2】:

我的解决方案是用透明(或任意)颜色绘制另一个数据集: - 具有固定数量 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多