2014-02-05 103 views
0

我之前發佈了一個關於使用GraphView庫中的CustomFormatLabeler將時間顯示爲x標籤(https://stackoverflow.com/questions/21567853/using-customlabelformatter-to-display-time-in-x-axis)的問題。我仍然無法找到解決方案,所以我嘗試編輯GraphView庫。我試圖溶液這裏建議:Using dates with the Graphview libraryGraphView中的時間標籤

我修改:

public GraphViewData(double valueX, double valueY) 

通過添加第三輸入變量(字符串valueDate)和被叫getTime方法(),它返回這個字符串值建議。然後我修改generateHorlabels如下圖所示:

private String[] generateHorlabels(float graphwidth) { 
    int numLabels = getGraphViewStyle().getNumHorizontalLabels()-1; 
    if (numLabels < 0) { 
     numLabels = (int) (graphwidth/(horLabelTextWidth*2)); 
    } 

    String[] labels = new String[numLabels+1]; 
    double min = getMinX(false); 
    double max = getMaxX(false); 

    for (int i=0; i<=numLabels; i++) { 
     Double temp = min + ((max-min)*i/numLabels); 
     int rounded =(int)Math.round(temp)-1; 
     if(rounded < 0){ 
      labels[i] = " "; 
     }else{ 
      if(graphSeries.size() > 0){ 
       GraphViewDataInterface[] values = graphSeries.get(0).values; 
       if(values.length > rounded){ 
        labels[i] = values[rounded].getTime(); 
       }else{ 
        labels[i] = " "; 
       } 
      } 
     } 
    } 
    return labels; 
} 

我不得不從弄圓,因爲我正在出界錯誤的可變減去1。這比自定義格式貼標機的效果更好,因爲水平標籤和實時標籤之間沒有延遲。然而,在大約600個數據點,

rounded 

比的

values 

長度更大,我得到的出界錯誤。有沒有人嘗試修改GraphView庫以顯示成功的時間?我對java和android編程很新,所以一些建議會很棒。謝謝閱讀。

回答

0

我發現:

GraphViewDataInterface[] values = graphSeries.get(0).values; 

停止尺寸的增大,當它到達maxDataCount由GraphViewData類的appendData功能設置。這是我得到數組索引超出界限錯誤的原因。這是我的解決方案。這不是最好看的代碼,但它似乎工作。原始的GraphView庫聲明私有的最終列表graphSeries; .get(0).values來自List類。

private String[] generateHorlabels(float graphwidth) { 
    int numLabels = getGraphViewStyle().getNumHorizontalLabels()-1; 
    if (numLabels < 0) { 
     numLabels = (int) (graphwidth/(horLabelTextWidth*2)); 
    } 

    String[] labels = new String[numLabels+1]; 
    double min = getMinX(false); 
    double max = getMaxX(false); 
    double temp = 0; 

    GraphViewDataInterface[] values = graphSeries.get(0).values; 

    for (int i=0; i<=numLabels; i++) { 

     if(max < values.length){ 
      temp = min + ((max-min)*i/numLabels); 
     }else{ 
      temp = (values.length - (max-min)) + ((max-min)*i/numLabels); 
     } 
     int rounded =(int)Math.round(temp)-1; 

     if(rounded < 0){ 
      labels[i] = " "; 
     }else{ 
      if(values.length > rounded){ 
       labels[i] = values[rounded].getTime(); 
      }else{ 
       labels[i] = " "; 
      } 
     } 
    } 
    return labels; 
} 

如果您嘗試做同樣的事情,試試看,並讓我知道是否有問題。我會喜歡一些反饋。

編輯:我要補充一點,你還需要有映入當graphSeries.size()爲0

+0

什麼是你的graphSeries變量的數據類型的聲明?我假設它是GraphViewSeries,但沒有get()方法。這個答案不完整。 –

+1

Hi Stealth Rabbi,原來的graphview庫聲明瞭一個私有的final List graphSeries;在頂部,所以get(0).values函數來自List類。我已經編輯了上述內容來澄清這一點。 – user2218339