2013-05-29 3 views
0

AChartEngine의 막대 차트의 데이터를 업데이트하는 코드를 작성했습니다. 디버그 모드에서 코드를 실행하면 새 포인트가 배열에 추가됩니다. 그러나 새 막대가 화면에 표시되지 않습니다. AsyncTask를 사용하여 업데이트합니다.Android 업데이트 막대 차트

AsyncTask를 : 그것은 활동

@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(); 
     } 
에게의

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 때문에

설정 모든 데이터 :

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

이상한 점은 동일한 구성이 선 차트로 잘 작동한다는 것입니다. 그러나이 막 대형 차트에 의하면 다시 칠하지 않습니다. 당신이 당신의 onProgressUpdate_series 변수에 값을 추가 한 후 dataset를 업데이트하지 않는 것처럼 도움 :

답변

0

이 코드는 다음과 내가 그것을 변경하는 방법입니다, 지금 작동 :

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

에 대한

덕분에 나에게 보인다. setData()에서만 업데이트/생성 중이며 AsyncTask에서 다시 호출하지 않습니다. getBarChartView은 데이터 세트에서 데이터를 읽지 만 데이터 세트는 오래되었습니다.

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

그리고 사항 setData 다음 OnprogressUpdate을 변경

XYSeries _xySeries; 

: 상단의 변수에

추가 된이 :

+0

그래,하지만 데이터 세트에 추가하면 새로운 세리에트가 생성됩니다. 데이터 세트에서 serie를 가져 와서 데이터 세트에서 제거하고 세리에를 업데이트 한 다음 다시 추가하면 작동하지 않습니다. – Lutske