-1

當我從viewpager的片段(weekFragment)中加載gridview(帶有適配器weekAdapter)時,第一頁加載正常。但是,一旦我想切換頁面,它會給出一個StringIndexOutOfBoundsException。我無法弄清楚什麼是錯的。在LogCat中沒有報告,並且錯誤只顯示本地方法,我沒有修改。請告訴我如何解決這個問題。切換頁面時出現StringIndexOutOfBoundsException

weekFragment.java:

package nl.siebeh.schoolmate; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.ContextMenu; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.view.LayoutInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.GridView; 

public class weekFragment extends Fragment { 
    dbLayer db; 
    String[] array = new String[60]; 
    public String title; 
    View v; 

    /*@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 


     GridView gridview = (GridView) v.findViewById(R.id.gridview); 
     gridview.setAdapter(new weekAdapter(getActivity(), mContent)); 
    }*/ 

    public weekFragment newInstance(String title) { 
     weekFragment fragment = new weekFragment(); 
     fragment.title = title; 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 
     db = new dbLayer(getActivity()); 

     for(int i = 0; i < 60; i++){ 
      this.array[i] = String.valueOf(i); 
     } 

     ArrayList<ArrayList<Object>> result = new ArrayList<ArrayList<Object>>(); 

     if(title == "leraren"){ 
      result = db.getAllRowsAsArrays("weekTeacher", null); 
     }else if(title == "locatie"){ 
      result = db.getAllRowsAsArrays("weekLocation", null); 
     }else if(title == "vakken"){ 
      result = db.getAllRowsAsArrays("weekSubjects", null); 
     } 
     Log.i("SchoolMate", "Size of result: "+String.valueOf(result.size())); 
     for(int position = 0; position < result.size(); position++){ 
      ArrayList<Object> row = result.get(position); 
      int hour = Integer.valueOf(row.get(1).toString()).intValue(); 
      int day = Integer.valueOf(row.get(0).toString()).intValue(); 
      int pos = 6 * hour + day; 
      this.array[pos] = row.get(position).toString(); 
     } 

     this.array[2] = getResources().getStringArray(R.array.days)[0]; 
     this.array[3] = getResources().getStringArray(R.array.days)[1]; 
     this.array[4] = getResources().getStringArray(R.array.days)[2]; 
     this.array[5] = getResources().getStringArray(R.array.days)[3]; 
     this.array[6] = getResources().getStringArray(R.array.days)[4]; 

     for(int i = 1; i < 10; i++){ 
      this.array[i] = Integer.toString(i); 
     } 

     v = inflater.inflate(R.layout.week_fragment, container, false); 
     GridView gridview = (GridView) v.findViewById(R.id.gridview); 
     if(getActivity() == null){ 
      Log.i("SchoolMate", "getActivty() returns null"); 
     } 
     StringBuilder sb = new StringBuilder(); 
     for(int i = 0; i < 60; i++){ 
      sb.append("array["+i+"] = \""+array[i]+"\" \n"); 
     } 
     Log.i("SchoolMate", sb.toString()); 
     gridview.setAdapter(new weekAdapter(getActivity(), array)); 
     return gridview; 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
     return super.onContextItemSelected(item); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
    } 



} 

weekAdapter.java:

package nl.siebeh.schoolmate; 

import android.content.Context; 
import android.graphics.Color; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

public class weekAdapter extends BaseAdapter { 
    public String[] strings; 
    Context mContext; 

    public weekAdapter(Context c, String[] s){ 
     strings = s.clone(); 
     mContext = c; 
     Log.i("SchoolMate", "weekAdapter called"); 
    } 

    @Override 
    public int getCount() { 
     return 60; 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView tv; 
     //if (convertView == null) { // if it's not recycled, initialize some attributes 
      tv = new TextView(mContext); 
      try{ 
       tv.setText(strings[position]); 
      }catch(ArrayIndexOutOfBoundsException e){ 
       Log.i("SchoolMate", "Out of bounds; position = "+String.valueOf(position)); 
      } 
      tv.setBackgroundColor(Color.BLACK); 
      tv.setTextColor(Color.WHITE); 
     /*} else { 
      tv = (TextView) convertView; 
     }*/ 

     return tv; 
    } 

} 

錯誤:

ViewRoot.draw(boolean) line: 1546 
ViewRoot.performTraversals() line: 1258 
ViewRoot.handleMessage(Message) line: 1859 
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 3683  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 507 
ZygoteInit$MethodAndArgsCaller.run() line: 839 
ZygoteInit.main(String[]) line: 597 
NativeStart.main(String[]) line: not available [native method] 

編輯: 我確定,否則,如果(標題==「 vakken「)是原因。如果它被註釋掉,它就會起作用。順序無關緊要,這是導致錯誤的子句。今天晚些時候,我會嘗試做出單獨的ifs。

+0

嗨Swwizard!你怎麼能確定你的錯誤與StringIndexOutOfBoundsException有關?你或許應該'Log.d()'你的執行流程來確定問題發生在哪一行。還要將參數的值記錄到Native函數調用。 –

+0

您應該使用* native *方法發佈堆棧。這可能表明您以前做錯了什麼,並幫助他人幫助您。這不是你發佈的完整的stacktrace,對吧? – Knickedi

+0

@Laurent'在堆棧上方,它表示StringIndexOutOfBoundsException。也許它是StringArrayIndexOutOfBoundsException,現在不能檢查。我會嘗試Log.d,你有關於如何使用它的鏈接? – Siebe

回答

0

好吧,我發現我的問題。在這裏:

}else if(title == "vakken"){ 
    result = db.getAllRowsAsArrays("weekSubjects", null); 
} 

weekSubjects應該是weekSubject(而不在一端S)