2015-12-21 37 views
-1

我正在做一個android的時間管理應用程序,我有活動和標籤類包含在它。每個活動都有一個標籤,而在Statistics片段中,我希望通過使用以下信息製作餅圖:用戶使用特定標籤做了多少活動。所以爲此,我已經將achartengine lib包含到了我的項目中,並且我確信它可以正常工作(使用默認輸入嘗試它),但是需要用戶輸入的信息。所以我把這些信息,並試圖賦予那些在我創建的陣列,但在這個過程中我的for循環我採取了錯誤=>分配數組期間IndexOutOfBoundsException

12-21 22:56:47.330 6861-6861/com.beter。 timehole E/AndroidRuntime: 致命例外:main 進程:com.beter.timehole,PID:6861 java.lang.ArrayIndexOutOfBoundsException:length = 2;索引= 2 在 com.beter.timehole.fragments.StatisticsFragment.initData(StatisticsFragment.java:112)

所以我展示其中for循環異常點的任何幫助表示讚賞。

package com.beter.timehole.fragments; 

import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.app.Activity; 
import android.graphics.Color; 
import android.graphics.Paint.Align; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AbsListView; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

import org.achartengine.ChartFactory; 
import org.achartengine.chart.BarChart.Type; 
import org.achartengine.model.XYMultipleSeriesDataset; 
import org.achartengine.model.XYSeries; 
import org.achartengine.renderer.XYMultipleSeriesRenderer; 
import org.achartengine.renderer.XYSeriesRenderer; 
import org.achartengine.ChartFactory; 
import org.achartengine.GraphicalView; 
import org.achartengine.model.CategorySeries; 
import org.achartengine.model.SeriesSelection; 
import org.achartengine.renderer.DefaultRenderer; 
import org.achartengine.renderer.SimpleSeriesRenderer; 
import org.achartengine.ChartFactory; 
import org.achartengine.GraphicalView; 
import org.achartengine.chart.BarChart.Type; 
import org.achartengine.model.CategorySeries; 
import org.achartengine.model.XYMultipleSeriesDataset; 
import org.achartengine.model.XYSeries; 
import org.achartengine.renderer.DefaultRenderer; 
import org.achartengine.renderer.SimpleSeriesRenderer; 
import org.achartengine.renderer.XYMultipleSeriesRenderer; 
import org.achartengine.renderer.XYSeriesRenderer; 


import com.beter.timehole.R; 

import java.io.FileInputStream; 
import java.io.ObjectInputStream; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Random; 


public class StatisticsFragment extends Fragment { 

private View mView; 
private GraphicalView mGraphView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.statistics_fragment, container, false); 
    mView = rootView; 
    initData(); 
    return rootView; 
} 



private void initData() { 
    ArrayList<com.beter.timehole.core.Activity> activitiesArrayList = new ArrayList<com.beter.timehole.core.Activity>(); 
    activitiesArrayList = readActivitiesFromFile(); 

    ArrayList<String> temp = new ArrayList<String>(); 
    int tagNumber=0; 
    for(int i=0;i<activitiesArrayList.size();i++) 
    { 
     if(i==0) { 
      temp.add(activitiesArrayList.get(i).getTag().getTagName()); 
      tagNumber ++; 
     } 
     else if(temp.contains(activitiesArrayList.get(i).getTag().getTagName())) 
     {} 
     else 
     { 
      temp.add(activitiesArrayList.get(i).getTag().getTagName()); 
      tagNumber ++; 
     } 
    } 



    String[] codename = new String[tagNumber]; 
    Double[] values = new Double[tagNumber]; 
    String[] colors = new String[tagNumber]; 
    int j=1; 
    for(int i=0;i<activitiesArrayList.size();i++) 
    { 
      if(codename.length == 0) { 
       codename[0] = activitiesArrayList.get(i).getTag().getTagName(); 
       values[0]=1.0; 
      } 
      else if(Arrays.asList(codename).contains(activitiesArrayList.get(i).getTag().getTagName())) 
      { 
       int index = java.util.Arrays.asList(codename).indexOf(activitiesArrayList.get(i).getTag().getTagName()); 
       values[index]=values[index]+1; 
      } 
      else { 
       codename[j] = activitiesArrayList.get(i).getTag().getTagName();// It is where the error points(line no:112) 
       int index = java.util.Arrays.asList(codename).indexOf(activitiesArrayList.get(i).getTag().getTagName()); 
       values[index]=1.0; 
       j++; 
      } 
    } 

    for(int i=0; i<codename.length;i++) 
    { 
     int integer =(int) (Math.random()*1000000); 
     String color = "#" + integer; 
     colors[i]= color; 
    } 

    CategorySeries series = new CategorySeries("Android Platform Version"); 
    int length = codename.length; 
    for (int i = 0; i < length; i++) 
     series.add(codename[i], values[i]); 

    DefaultRenderer renderer = new DefaultRenderer(); 
    for (int i = 0; i < length; i++) { 
     SimpleSeriesRenderer seriesRenderer = new SimpleSeriesRenderer(); 
     seriesRenderer.setColor(Color.parseColor(colors[i])); 
     renderer.addSeriesRenderer(seriesRenderer); 

    } 

    renderer.setChartTitleTextSize(60); 
    renderer.setChartTitle("Android Platform Version"); 
    renderer.setLabelsTextSize(30); 
    renderer.setLabelsColor(Color.GRAY); 
    renderer.setLegendTextSize(30); 

    drawChart(series, renderer); 
} 
private ArrayList<com.beter.timehole.core.Activity> readActivitiesFromFile(){ 
    ArrayList<com.beter.timehole.core.Activity> activitiesFromFile = new ArrayList<>(); 
    try{ 
     FileInputStream activityFileInputStream = getContext().openFileInput("activityobjects.dat"); 
     ObjectInputStream activityObjectInputStream = new ObjectInputStream(activityFileInputStream); 
     activitiesFromFile = (ArrayList<com.beter.timehole.core.Activity>)activityObjectInputStream.readObject(); 
     activityObjectInputStream.close(); 
     activityFileInputStream.close(); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
    return activitiesFromFile; 
} 

private void drawChart(CategorySeries series, DefaultRenderer renderer) { 

    if (null == mGraphView) { 
     mGraphView = ChartFactory.getPieChartView(getActivity(), series, renderer); 
     RelativeLayout container = (RelativeLayout) mView.findViewById(R.id.graph_container); 
     container.addView(mGraphView); 
    } 
    else 
     mGraphView.repaint(); 
} 
} 
+0

根據你的錯誤信息,你會嘗試訪問'codename'數組中的第三個位置(索引'2'),但是'codename'的大小隻有'2'。真正由你來完成你的程序並找出爲什麼發生這種情況。 – sstan

+0

是的,我知道,但我無法弄清楚,這個項目是爲了明天,所以我想也許這是另一個我看不到的問題,並決定在這裏上傳。但是,如果有人能夠幫助我,我仍然在思考這個問題,那會很好。謝謝。 – Cuthalion

+0

爲什麼設置j = 1,codename.length = activitiesArrayList.size()+ 1? –

回答

0

這個問題似乎很簡單。索引指向數組列表的外部。您可以使用迭代器模式來幫助避免OutOfBounds異常,但除此之外,我建議僅在異常點處發出斷點,並確保比較正確的值以表示數組的末尾。