首页 文章

MPAndroidChart具有空值

提问于
浏览
4

我正在使用MPAndroidChart,我真的非常喜欢它 .

我需要的一点是,我可以将空值放入'entrys' . 我正在监视我系统服务器上的apache连接,我会看看它们是否已关闭(我将空值放在哪里)或者它们是否没有连接(0) .

我试过了,但是Entry类不接受'null'作为显示消息的值:'构造函数Entry(null,int)是未定义的'

谢谢!

2 回答

  • 1

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

    一个可能的解决方案可能是 check weather the object you received is null ,或不 . 如果对象为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
    }
    

    这会产生例如a LineChart 其中 ConnectionHolder 对象为空的索引上没有绘制圆圈 .

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

相关问题