2013-05-29 1 views
0

Я написал код для обновления данных гистограммы в AChartEngine. Когда я запускаю код в режиме отладки, новые точки добавляются в массив. Но новые бары не отображаются на экране. Я использую AsyncTask для обновления.Графическая диаграмма Android update

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(); 
    } 

И в УстановитьДанные :

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 после добавления значения в переменную _series в вашем onProgressUpdate. Вы только обновляете/создаете его в setData(), который вы не вызываете снова из своей AsyncTask. getBarChartView считывает данные из набора данных, но набор данных теперь устарел.

+0

Да, но когда вы добавите его в набор данных, он создаст новую серию. И это не сработает, когда вы получите серию из набора данных, удалите ее из набора данных, обновите серию и добавьте ее снова. – Lutske