0

AChartEngine で棒グラフのデータを更新するコードをいくつか書きました。コードをデバッグ モードで実行すると、新しいポイントが配列に追加されます。しかし、新しいバーは画面に表示されません。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;
        }

奇妙なことに、同じ構造が折れ線グラフでもうまく機能します。しかし、この棒グラフでは塗り直しがうまくいきません。

助けてくれてありがとう :)

4

2 に答える 2

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 に変換します。そのため、どこでも更新してデータセットに追加できます。

于 2013-05-30T07:53:39.857 に答える