索引超出范围Android中的表格布局异常

时间:2014-02-20 15:34:13

标签: android indexoutofboundsexception android-tablelayout

我的活动,我从数据中获取数据并将其设置为带有列的表行,但我有错误是索引超出范围。可以解释为什么这样做以及如何在正确的解决方案中进行。

这是我的代码

public class MybookActivity extends Activity{

private BooksDB db;
private Context context;
private HashMap< String, ArrayList<String>> hm;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.layout_mybook_sub2);

    ArrayList<String> list_bokID = new ArrayList<String>();
    ArrayList<String> list_title = new ArrayList<String>();
    ArrayList<String> list_theme = new ArrayList<String>();
    hm = new HashMap<String, ArrayList<String>>();


    context = this;
    db = new BooksDB(context);
    hm = db.getBookTheme();
    if(hm.isEmpty() == true){
        System.out.println("NO data");

    }else{
        System.out.println("have data");
        list_bokID = hm.get("bokID");
        for (String bokID : list_bokID){
            System.out.println(bokID);
        }
        list_title = hm.get("title");
        for (String title : list_title) {
            System.out.println(title);

        }
        list_theme = hm.get("theme");
        for (String themePath : list_theme) {
            System.out.println(themePath);
        }
    }

    int Theme_size = list_theme.size();
    //new
    int numRow = Theme_size;



    TableLayout tblLayout = (TableLayout) findViewById(R.id.tblLayout);

    for(int i = 1; i < numRow; i++) {
        HorizontalScrollView HSV = new HorizontalScrollView(this);
        HSV.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

        TableRow tblRow = new TableRow(this);
        tblRow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        tblRow.setBackgroundResource(R.drawable.newshell);

        for(int j = (i -1)*5; j < i*5; j++) {

             Log.i("i",Integer.toString(i,j));
             Log.i("j", Integer.toString(j));
             ImageView imageView = new ImageView(this);

                if (list_theme.size() > j){
                    String themeName = list_theme.get(j);
                    res_id = getResources().getIdentifier(themeName, "drawable", getPackageName());
                    imageView.setImageResource(res_id);
                    tblRow.addView(imageView,j);
                }

            }


        HSV.addView(tblRow);
        tblLayout.addView(HSV, i);
    }
}

}

这是我的logcat错误

02-20 23:15:03.656: I/i(17729): 1
02-20 23:15:03.656: I/j(17729): 0
02-20 23:15:03.681: I/i(17729): 1
02-20 23:15:03.681: I/j(17729): 1
02-20 23:15:03.706: I/i(17729): 1
02-20 23:15:03.706: I/j(17729): 2
02-20 23:15:03.711: I/i(17729): 1
02-20 23:15:03.711: I/j(17729): 3
02-20 23:15:03.711: I/i(17729): 1
02-20 23:15:03.711: I/j(17729): 4
02-20 23:15:03.731: D/dalvikvm(17729): GC_FOR_ALLOC freed 24K, 13% free 15656K/17991K, paused 10ms, total 10ms
02-20 23:15:03.736: D/AndroidRuntime(17729): Shutting down VM
02-20 23:15:03.736: W/dalvikvm(17729): threadid=1: thread exiting with uncaught exception (group=0x40f472a0)
02-20 23:15:03.741: E/AndroidRuntime(17729): FATAL EXCEPTION: main
02-20 23:15:03.741: E/AndroidRuntime(17729): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.splash.bookguk_project/category_viewbook_sub2_1.MybookActivity}: java.lang.IndexOutOfBoundsException: index=1 count=0
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.ActivityThread.access$700(ActivityThread.java:140)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.os.Looper.loop(Looper.java:137)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.ActivityThread.main(ActivityThread.java:4921)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at java.lang.reflect.Method.invokeNative(Native Method)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at java.lang.reflect.Method.invoke(Method.java:511)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at dalvik.system.NativeStart.main(Native Method)
02-20 23:15:03.741: E/AndroidRuntime(17729): Caused by: java.lang.IndexOutOfBoundsException: index=1 count=0
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.view.ViewGroup.addInArray(ViewGroup.java:3703)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3642)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.view.ViewGroup.addView(ViewGroup.java:3491)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.widget.TableLayout.addView(TableLayout.java:425)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.view.ViewGroup.addView(ViewGroup.java:3436)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.widget.TableLayout.addView(TableLayout.java:407)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at category_viewbook_sub2_1.MybookActivity.onCreate(MybookActivity.java:99)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.Activity.performCreate(Activity.java:5206)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
02-20 23:15:03.741: E/AndroidRuntime(17729):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
02-20 23:15:03.741: E/AndroidRuntime(17729):    ... 11 more

谢谢

1 个答案:

答案 0 :(得分:0)

我觉得违规行是:

for(int j = (i -1)*5; j < i*5; j++)
    String themeName = list_theme.get(j);

您正在访问数组中的项目j,但不检查其边界。你只是假设它有很多项目。你需要添加像

这样的东西
if (list_theme.size >= j)
    String themeName = list_theme.get(j);

另一方面,我从1开始,这总是一个可疑的事情。 (我不是说错了,只是怪异的)

for(int i = 1; i < numRow; i++)