-1

当我从视图页面的片段(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]  

编辑:我确定 else if(title == "vakken") 是原因。如果它被注释掉,它就可以工作。顺序无关紧要,正是这个子句导致了错误。今天晚些时候,我将尝试制作单独的 ifs。

4

1 回答 1

0

好的,我发现了我的问题。这里:

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

weekSubjects 应该是 weekSubject (最后没有 s)

于 2011-10-03T12:47:16.337 回答