2013-10-18 111 views
-1

我有一個應用程序包含一些圖形使用AChartEngine庫,它自動更新後,用戶從服務器上下載一些新的數據。該圖只包含一個固定數量的點,每次下載後,我將新的數據添加到圖中並刪除最舊的保留顯示數據的數量,然後我調用重繪函數。但重繪不起作用,因爲舊數據繼續在圖上顯示,只有當我重新啓動應用程序,他們消失。這是實現Graph小部件的代碼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(); 
} 
} 

出了什麼問題?

回答

0

您正在以錯誤的方式刪除值。讓我們考慮一個例子:

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

讓我們根據自己的算法刪除2個值:

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

輸入:1,2,3,4 刪除(0)結果2,3,4 刪除(1)結果2,4這不是你想要的

remove(0)來代替。