0

ユーザーがサーバーから新しいデータをダウンロードした後に自動的に更新される、AChartEngine ライブラリを使用したグラフがアプリに含まれています。グラフには固定数のポイントのみが含まれ、ダウンロードごとに新しいデータをグラフに追加し、表示されたデータの数を保持するために最も古いデータを削除してから、再描画関数を呼び出します。しかし、古いデータがグラフに表示され続け、アプリを再起動した場合にのみ消えるため、再描画は機能しません。これはグラフウィジェットを実装するクラスのコードです

public class LineGraph {
Context context;
GraphicalView graphicalView = null;
TimeSeries tempSeries = null;
TimeSeries humSeries = null;
XYMultipleSeriesDataset dataset = null;
XYSeriesRenderer rendererTemp = null;
XYSeriesRenderer rendererHum = null;
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

public LineGraph(Context context) {
    this.context = context;
}

// build empty graph
public View buildGraph(Fragment f) {
    dataset = new XYMultipleSeriesDataset();
    // set properties
    if (f.getClass().equals(TempFragment.class)
            || f.getClass().equals(MixFragment.class)) {
        tempSeries = new TimeSeries("");
        dataset.addSeries(tempSeries);
        rendererTemp = new XYSeriesRenderer();
        rendererTemp.setPointStyle(PointStyle.CIRCLE);
        rendererTemp.setLineWidth(2);
        rendererTemp.setColor(Color.RED);
    }
    if (f.getClass().equals(HumFragment.class)
            || f.getClass().equals(MixFragment.class)) {
        humSeries = new TimeSeries("");
        dataset.addSeries(humSeries);
        rendererHum = new XYSeriesRenderer();
        rendererHum.setPointStyle(PointStyle.CIRCLE);
        rendererHum.setLineWidth(2);
        rendererHum.setColor(Color.BLUE);
    }

    XYMultipleSeriesRenderer multipleRenderer = new XYMultipleSeriesRenderer();
    multipleRenderer.setYAxisMin(15);
    multipleRenderer.setYAxisMax(80);
    if (tempSeries != null) {
        multipleRenderer.addSeriesRenderer(rendererTemp);
    }
    if (humSeries != null) {
        multipleRenderer.addSeriesRenderer(rendererHum);
    }
    multipleRenderer.setShowGrid(true);
    multipleRenderer.setPointSize(8);
    multipleRenderer.setClickEnabled(true);
    multipleRenderer.setShowLegend(false);
    multipleRenderer.setShowLabels(true);
    multipleRenderer.setLabelsTextSize(20);
    multipleRenderer.setXRoundedLabels(false);
    // create view
    if (graphicalView == null) {
        graphicalView = ChartFactory.getTimeChartView(context, dataset,
                multipleRenderer, "");
        graphicalView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                SeriesSelection seriesSelection = graphicalView
                        .getCurrentSeriesAndPoint();
                if (seriesSelection != null) {
                    Toast.makeText(
                            context,
                            "Data "
                                    + dateFormat.format(seriesSelection
                                            .getXValue())
                                    + " Valore rilevato: "
                                    + seriesSelection.getValue(),
                            Toast.LENGTH_LONG).show();
                }
            }
        });
    }
    return graphicalView;
}

/*
 * refresh graph with new data
 */
@SuppressLint("SimpleDateFormat")
public void refresh(ArrayList<String[]> list, int to_remove) {
    try {
        if (tempSeries != null) {
            for (int i = 0; i < list.size(); i++) {
                tempSeries.add(dateFormat.parse(list.get(i)[2]),
                        Double.valueOf(list.get(i)[0]));
            }
            if (to_remove > 0) {
                for (int i = 0; i < to_remove; i++) {
                    tempSeries.remove(i);
                }
            }
        }
        if (humSeries != null) {
            for (int i = 0; i < list.size(); i++) {
                double to_add = Double.valueOf(list.get(i)[1]);

                humSeries.add(dateFormat.parse(list.get(i)[2]), to_add);
            }
            if(to_remove>0) {
                for (int i = 0; i < to_remove; i++) {
                    humSeries.remove(i);
                }
            }
        }
    } catch (NumberFormatException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    graphicalView.repaint();
}
}

どうしたの?

4

1 に答える 1

0

間違った方法で値を削除しています。例を考えてみましょう:

int[] values = new int[] {1, 2, 3, 4};

アルゴリズムに従って 2 つの値を削除しましょう。

for (int i = 0; i < 2; i++) {
  remove(i);
}

入力: 1, 2, 3, 4 remove(0) 結果 2, 3, 4 remove(1) 結果 2, 4 これはあなたが望むものではありません

remove(0)代わりに行います。

于 2013-10-23T13:31:33.333 に答える