Search code examples
androiddatasettime-seriesachartenginerenderer

achartengine clear renderers in XYMultipleSeriesRenderer


My goal is create a graph that will hide and show a series depending on user actions. I thought to do that by first clearing the graph and dataset and renderers and then reinserting the new values. Much like the .clear() method of Arraylists, I was wondering if there was some type of similar functionality built for the XYMultipleSeriesRenderer. I noticed that the XYMultipleSeriesDataset was lacking similar functionality, but i was able to resolve that (i think, i can't be sure yet) by doing

        for(int i = 0; i < dataset.getSeriesCount(); i++) {
            dataset.removeSeries(i);
        }

Luckily XYMultipleSeriesRenderer seems to have a getrenderercount type of method, but not a remove method that takes ints. All i see is a remove function that doesn't take ints, just actual series renderer names.

Here is more code if that helps:

private void excecuteGraph() {
    //      add series to the complete dataset
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    XYMultipleSeriesRenderer mrenderer = new XYMultipleSeriesRenderer();

    switch (graphCase ){
    case -1:
        dataset.addSeries(series0);
        dataset.addSeries(series1);
        dataset.addSeries(series2);
        dataset.addSeries(series3);     

        //          create the individual renderers, customize settings for each
        XYSeriesRenderer renderer1 = new XYSeriesRenderer();
        renderer1.setColor(Color.BLUE);
        renderer1.setLineWidth(3);
        XYSeriesRenderer renderer2 = new XYSeriesRenderer();
        renderer2.setColor(Color.DKGRAY);
        renderer2.setLineWidth(3);
        XYSeriesRenderer renderer3 = new XYSeriesRenderer();
        renderer3.setColor(Color.RED);      
        renderer3.setLineWidth(3);
        XYSeriesRenderer renderer4 = new XYSeriesRenderer();
        renderer4.setColor(Color.WHITE);        
        renderer4.setLineWidth(3);

        //          add renderers to the complete multirenderer, customize settings for it
        mrenderer.addSeriesRenderer(renderer1);
        mrenderer.addSeriesRenderer(renderer2);
        mrenderer.addSeriesRenderer(renderer3);
        mrenderer.addSeriesRenderer(renderer4);
        break;
    case 0:
        for(int i = 0; i < dataset.getSeriesCount(); i++) {
            dataset.removeSeries(i);
        }

        dataset.addSeries(series0);
        XYSeriesRenderer renderer00 = new XYSeriesRenderer();
        renderer00.setColor(Color.BLUE);
        renderer00.setLineWidth(3);
        mrenderer.addSeriesRenderer(renderer00);
        break;
    case 1:
        for(int i = 0; i < dataset.getSeriesCount(); i++) {
            dataset.removeSeries(i);
            Log.d("testingGraph", dataset.toString());
        }

        dataset.addSeries(series1);
        XYSeriesRenderer renderer10 = new XYSeriesRenderer();
        renderer10.setColor(Color.DKGRAY);
        renderer10.setLineWidth(3);
        mrenderer.addSeriesRenderer(renderer10);
        break;
    case 2:
        for(int i = 0; i < dataset.getSeriesCount(); i++) {
            dataset.removeSeries(i);
        }
        dataset.addSeries(series2);
        XYSeriesRenderer renderer20 = new XYSeriesRenderer();
        renderer20.setColor(Color.RED);     
        renderer20.setLineWidth(3);
        mrenderer.addSeriesRenderer(renderer20);
    case 3:
        for(int i = 0; i < dataset.getSeriesCount(); i++) {
            dataset.removeSeries(i);
        }
        dataset.addSeries(series3);
        XYSeriesRenderer renderer30 = new XYSeriesRenderer();
        renderer30.setColor(Color.WHITE);       
        renderer30.setLineWidth(3);
        mrenderer.addSeriesRenderer(renderer30);
    }

    mrenderer.setYTitle("Accuracy (%)");
    mrenderer.setYAxisMin(0);
    mrenderer.setYAxisMax(100);
    mrenderer.setApplyBackgroundColor(true);
    mrenderer.setBackgroundColor(Color.TRANSPARENT);

    //      Get the chart view result, add it to the linear layout
    GraphicalView mChartView = ChartFactory.getTimeChartView(this, dataset,
            mrenderer, "MM/dd/yyyy");

    LinearLayout graphLayout = (LinearLayout) findViewById(R.id.layout_graph);
    graphLayout.addView(mChartView, new LayoutParams(LayoutParams.MATCH_PARENT,
            LayoutParams.MATCH_PARENT));        

    if (mChartView !=null) {
        mChartView.repaint();
    }

}

Solution

  • Not sure I understand your question entirely, but I can give you some clues.

    To remove all renderers in an XYMultipleSeriesRenderer:

    renderer.removeAllRenderers();
    

    To remove all series in an XYMultipleSeriesDataset:

    int size = dataset.getSeriesCount();
    for (int i = 0; i < size; i++) {
      // always remove the first element because once you remove one element,
      // the size of the list becomes size - 1 and so on
      dataset.removeSeries(0);
    }
    

    However, if you want to hide one single series, then just remove that one and not all of them.