2013-05-29 74 views
0

我没有写一些代码来更新AChartEngine中条形图的数据。当我在调试模式下运行代码时,新的点被添加到数组中。但新屏幕并未显示在屏幕上。我使用AsyncTask进行更新。Android更新条形图

的AsyncTask:

private class ChartTask2 extends AsyncTask<Void, String, Void>{ 
      // Generates dummy data in a non-ui thread 
      @Override 
      protected Void doInBackground(Void... params) { 
       try{ 
        for(int i = 0; i < 5; i++) { 
         Log.v("Asyntask", "doInBackground"); 
         String [] values = new String[2]; 

         values[0] = Double.toString(6+ i); 
         values[1] = Double.toString(6 +i); 

         publishProgress(values); 
         Thread.sleep(1000); 
         Log.v("i", Integer.toString(6+i)); 
        } 
       }catch(Exception e){ } 
       return null; 
      } 
      // Plotting generated data in the graph 
      @Override 
      protected void onProgressUpdate(String... values) { 
       _series.add("Bar" + Double.parseDouble(values[0]),Double.parseDouble(values[1])); 
       _mChartView.repaint(); 
       Log.v("Asyntask", "repaint onProgressUpdate"); 
      } 
     } 

OneCreate因为它是一个活动

@Override 
protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      Log.v("inCreate","inCreate"); 
      // Get ALL the data!!! 
      Bundle extras = getIntent().getExtras(); 
      if (extras != null) { 
       this._chartTitle = extras.getString("chartTitle"); 
       this._xTitle = extras.getString("xTitle"); 
       // and other variables are filled here 
      } 
      setData(); 
      Log.v("method","call Asynctask"); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 
       new ChartTask2().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[])null); 
      else 
       new ChartTask2().execute(); 
     } 

设置中的所有数据:

public void setData() { 
     Log.v("method","setData"); 
     // Add the bar data 
     dataset = new XYMultipleSeriesDataset(); 
     for(int bars = 0; bars < (_yCoords.length); bars++){ 
      _series = new CategorySeries(_barNames[bars]); 
      for (int point = 0; point < (_yCoords[bars].length); point++){ 
       _series.add("Bar " + _yCoords[bars][point], _yCoords[bars][point]); 
      } 
      dataset.addSeries(_series.toXYSeries()); 
     } 

     // Holds a collection of XYSeriesRenderer and customizes the graph 
     mRenderer = new XYMultipleSeriesRenderer(); 

     // Customize Bars 
     for(int i = 0; i < _yCoords.length; i++){ 
      _renderer = new XYSeriesRenderer();     
      _renderer.setColor(_colors[i]); 
      _renderer.setDisplayChartValues(_displayValues[i]); 
      _renderer.setChartValuesSpacing(_valuesSpacing[i]);     

      mRenderer.addSeriesRenderer(_renderer); 
    } 
     // Set optional settings 
     mRenderer.setChartTitle(_chartTitle); 
     //and more data is set here 

     setContentView(drawData()); 
    } 

如何得出数据:

public View drawData() { 
       Log.v("method","tekenData"); 

       // Set background 
       View view = View.inflate(this, _layout, null); 

       // Getting a reference to view group linear layout chart_container 
       LinearLayout chartContainer = (LinearLayout) view.findViewById(_wrapper); 

       // Getting LineChartView to add to the custom layout 
       _mChartView = ChartFactory.getBarChartView(this, dataset, mRenderer, Type.DEFAULT); 

       // Adding the line chart to the custom layout 
       chartContainer.addView(_mChartView); 

       return view; 
     } 

奇怪的是,相同的建筑工程很好的线图。但是通过这个条形图,它不会重新绘制好。

感谢您的帮助:)

回答

0

代码工作现在,这是我如何改变:

已将此添加变量顶部:

XYSeries _xySeries; 

改变了OnprogressUpdate:

@Override 
    protected void onProgressUpdate(String... values) { 
        _xySeries.add(Double.parseDouble(values[0]),Double.parseDouble(values[1])); 
        _mChartView.repaint(); 
    } 

而且使用setData :

public void setData() { 
       // Add the bar data 
       dataset = new XYMultipleSeriesDataset(); 
       for(int bars = 0; bars < (_yCoords.length); bars++){ 
        _series = new CategorySeries(_barNames[bars]); 
        for (int point = 0; point < (_yCoords[bars].length); point++){ 
         _series.add("Bar " + _yCoords[bars][point], _yCoords[bars][point]); 
        } 
        _xySeries = _series.toXYSeries(); 
        dataset.addSeries(_xySeries); 
       } 
//.... and more of the old setData 

所以我做了一个新的xyserie类型的系列。将数据添加到旧系列,然后将其转换为xyseries。所以你可以在任何地方更新它并将其添加到数据集中。

2

在我看来,像你没有更新dataset你在onProgressUpdate增加值到_series变量之后。您只需在setData()中更新/创建它,您不会再从AsyncTask中调用它。 getBarChartView从数据集读取数据,但数据集现在已过时。

+0

是的,但是当你将它添加到数据集时,它会创建一个新的系列。而当您从数据集中取出系列时,将其从数据集中删除,更新系列并再次添加它将不起作用。 – Lutske