-1

Когда я загружаю gridview (с адаптером weekAdapter) изнутри фрагмента (weekFragment) для viewpager, первая страница загружается штрафом. Однако, как только я хочу переключить страницу, он дает исключение 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] 

EDIT: я решил, что еще если (название == " vakken ") является причиной. Если он прокомментирован, он просто работает. Порядок не имеет значения, именно этот пункт вызывает ошибку. Позже сегодня я постараюсь сделать раздельные ifs.

+0

Hi Swwizard! Как вы можете точно сказать, что ваша ошибка связана с StringIndexOutOfBoundsException? Вы должны, возможно, «Log.d()» выполнить свой поток выполнения, чтобы определить, в какой строке вашего источника возникает проблема. Также зарегистрируйте значение аргументов для вызова функции Native. –

+0

Вы должны опубликовать стек с помощью * родных * методов. Это может указывать на то, что вы делали неправильно раньше, и помогать другим помочь вам. Это не полный стек, который вы опубликовали, не так ли? – Knickedi

+0

@Laurent 'Над стеком там написано StringIndexOutOfBoundsException. Возможно, это StringArrayIndexOutOfBoundsException, не могу проверить это сейчас. Я попробую Log.d, у вас есть ссылка о том, как его использовать? – Siebe

ответ

0

Хорошо, я выяснил свою проблему. Здесь:

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

weekSubjects должен быть weekSubject (без с в конце)

Смежные вопросы