【问题标题】:StringIndexOutOfBoundsException when switching page [closed]切换页面时出现StringIndexOutOfBoundsException [关闭]
【发布时间】:2011-10-02 06:09:54
【问题描述】:

当我从 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]  

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

【问题讨论】:

  • 嗨 Swwizard!如何确定您的错误与 StringIndexOutOfBoundsException 相关?您也许应该 Log.d() 您的执行流程来确定问题发生在源代码的哪一行。还将参数的值记录到 Native 函数调用。
  • 您应该使用 native 方法发布堆栈。这可能表明您之前做错了什么并帮助其他人帮助您。这不是您发布的完整堆栈跟踪,对吧?
  • @Laurent' 在堆栈上方显示 StringIndexOutOfBoundsException。也许是 StringArrayIndexOutOfBoundsException,现在无法检查。我会试试 Log.d,你有如何使用它的链接吗?
  • @Knickedi 问题是这是完整的堆栈跟踪!

标签: android android-fragments android-gridview android-viewpager


【解决方案1】:

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

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

weekSubjects 应该是 weekSubject(末尾没有 s)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多