当我从viewpager的片段(weekFragment)中加载gridview(带适配器weekAdapter)时,第一页加载正常。但是,一旦我想切换页面,它就会产生一个StringIndexOutOfBoundsException。我无法弄清楚出了什么问题。在LogCat中没有报告任何内容,并且错误仅显示我没有修改的本机方法。请告诉我如何解决这个问题。
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]
编辑: 我确定其他if(title ==“vakken”)是原因。如果它被注释掉,它就可以了。顺序无关紧要,导致错误的是此子句。今天晚些时候,我将尝试制作单独的ifs。
答案 0 :(得分:0)
好的,我发现了我的问题。这里:
}else if(title == "vakken"){
result = db.getAllRowsAsArrays("weekSubjects", null);
}
weekSubjects应该是weekSubject(最后没有s)