Когда я загружаю 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.
Hi Swwizard! Как вы можете точно сказать, что ваша ошибка связана с StringIndexOutOfBoundsException? Вы должны, возможно, «Log.d()» выполнить свой поток выполнения, чтобы определить, в какой строке вашего источника возникает проблема. Также зарегистрируйте значение аргументов для вызова функции Native. –
Вы должны опубликовать стек с помощью * родных * методов. Это может указывать на то, что вы делали неправильно раньше, и помогать другим помочь вам. Это не полный стек, который вы опубликовали, не так ли? – Knickedi
@Laurent 'Над стеком там написано StringIndexOutOfBoundsException. Возможно, это StringArrayIndexOutOfBoundsException, не могу проверить это сейчас. Я попробую Log.d, у вас есть ссылка о том, как его использовать? – Siebe