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;
}
奇妙なことに、同じ構造が折れ線グラフでもうまく機能します。しかし、この棒グラフでは塗り直しがうまくいきません。
助けてくれてありがとう :)