我正在Android中创建用于填充可扩展列表视图的Android应用程序。我已经成功地从SQLite填充了exapandable列表视图。但问题是在进行一些更改之后我必须在活动中添加两个按钮,即可扩展的列表视图。
当我点击第一个button_btnNewProject时,它转到第二个Activity,在第二个Activity中我插入了一些项目细节,当我回到同一个活动时,项目细节想要在Expandable list视图中显示。
当我运行项目应用程序崩溃并获得异常`java.lang.IndexOutOfBoundsException:索引0无效,大小为0。之前它在我的可扩展列表视图中显示。
这是我的数据库帮助程序代码。
public boolean insertProject (String strProjectName, String strCreatedDate, String strEndDate, String strIsActive)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(Project_Name, strProjectName);
contentValues.put(Project_Date_Created, strCreatedDate);
contentValues.put(Project_End_Date, strEndDate);
contentValues.put(Project_Is_Active, strIsActive);
db.insert(CONTACTS_TABLE_NAME, null, contentValues);
db.close();
return true;
}
public Cursor getData(String string){
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from" +CONTACTS_TABLE_NAME + "where"+Project_id+"="+string+"", null );
return res;
}
public int numberOfRows(){
SQLiteDatabase db = this.getReadableDatabase();
int numRows = (int) DatabaseUtils.queryNumEntries(db, CONTACTS_TABLE_NAME);
return numRows;
}
public List viewTable() {
//String result="";
List arrList=new ArrayList ();
try {
SQLiteDatabase db=this.getWritableDatabase();
String query="select * from " + CONTACTS_TABLE_NAME;
Log.d("query message ", query);
Cursor c = db.rawQuery(query, null);
size=c.getCount();
nameVal=new String[size];
dateval=new String[size];
endDateVal=new String[size];
isActiveVal=new String[size];
int col1 = c.getColumnIndex(Project_Name);
int col2 = c.getColumnIndex(Project_Date_Created);
int col3 = c.getColumnIndex(Project_End_Date);
int col4 = c.getColumnIndex(Project_Is_Active);
if (c != null)
{
if( c.moveToFirst())
{
do {
nameVal[i]=c.getString(col1);
dateval[i]=c.getString(col2);
endDateVal[i]=c.getString(col3);
isActiveVal[i]=c.getString(col4);
//arrList.add(ageVal[i]+"");
//result=result+nameVal+" "+ageVal+" ";
System.out.println("Name :"+nameVal[i]);
System.out.println("dateval :"+dateval[i]);
System.out.println("endDateVal :"+endDateVal[i]);
System.out.println("isActiveVal :"+isActiveVal[i]);
i++;
} while (c.moveToNext());
//06-17 13:53:00.281: E/AndroidRuntime(14245): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
arrList.add(nameVal);
arrList.add(dateval);
arrList.add(endDateVal);
arrList.add(isActiveVal);
}
}
db.close();
}catch(SQLiteFullException exp) {
exp.getMessage();
Log.d("Exception Cause", exp.getMessage());
}
return arrList;
}
Here is my activity code
public class My_Project extends ExpandableListActivity
{
//ExpandableListAdapter listAdapter;
ExpandableListView expListView;
Button btnNewProject;
Button btn_myprojectdefinemyteam;
HashMap<String, List<String>> listDataChild;
DBHelper databaseHelper;
SQLiteDatabase db;
Adapter adp;
List dispDataList;
String Strname;
String Name;
String[] data;
String[] strProjectame;
String[] strdateCreated;
String[] strEndDate;
String[] strIsActive;
String[] dtrProjectNAmeSize;
public static final String Project_Name = "project_name";
public static final String Project_Date_Created = "project_date_created";
public static final String Project_End_Date = "project_end_date";
public static final String Project_Is_Active = "IsActive";
ExpandableListAdapter mAdapter;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.my_project);
databaseHelper = new DBHelper(getApplicationContext());
dispDataList=databaseHelper.viewTable();
dtrProjectNAmeSize=new String[dispDataList.size()];
strProjectame=(String[])dispDataList.get(0);
strdateCreated=(String[]) dispDataList.get(1);
strEndDate = (String[])dispDataList.get(2);
strIsActive = (String[])dispDataList.get(3);
for(int i=0;i<strProjectame.length;i++)
{
System.out.println("New data :"+strProjectame[i]);
}
List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
for (int i = 0; i < strProjectame.length ; i++)
{
Map<String, String> curGroupMap = new HashMap<String, String>();
groupData.add(curGroupMap);
curGroupMap.put(Project_Name,"" +strProjectame[i]);
List<Map<String, String>> children = new ArrayList<Map<String, String>>();
Map<String, String> curChildMap = new HashMap<String, String>();
children.add(curChildMap);
curChildMap.put(Project_Date_Created,"" +strdateCreated[i]);
curChildMap.put(Project_End_Date,"" +strEndDate[i]);
curChildMap.put(Project_Is_Active,"" +strIsActive[i]);
childData.add(children);
}
expListView = (ExpandableListView) findViewById(android.R.id.list);
expListView.setOnGroupClickListener(new OnGroupClickListener()
{
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id)
{
return false;
}
});
expListView.setOnGroupExpandListener(new OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
Toast.makeText(getApplicationContext(),
dtrProjectNAmeSize.length + " Expanded",
Toast.LENGTH_SHORT).show();
}
});
expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
Toast.makeText(getApplicationContext(),
dtrProjectNAmeSize.length + " Collapsed",
Toast.LENGTH_SHORT).show();
}
});
mAdapter = new SimpleExpandableListAdapter(
this,
groupData,
R.layout.list_group,
new String[] { Project_Name },
new int[] {R.id.lblListHeader },
childData,
R.layout.child_item,
new String[] { Project_Date_Created , Project_End_Date , Project_Is_Active},
new int[] { R.id.TextView_Projectdetails , R.id.textOne , R.id.textTwo }
);
expListView.setAdapter(mAdapter);
btnNewProject = (Button)findViewById(R.id.buttonmyproject_NewProject);
btnNewProject.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(My_Project.this , Add_Project.class);
startActivity(i);
finish();
}
});
btn_myprojectdefinemyteam = (Button)findViewById(R.id.buttonmyprojectdefinemyteam);
btn_myprojectdefinemyteam.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(My_Project.this , Team_Member.class);
startActivity(i);
finish();
}
});
}
}
这是我的Log cat文本信息。
06-17 14:33:50.531: E/AndroidRuntime(17227): FATAL EXCEPTION: main
06-17 14:33:50.531: E/AndroidRuntime(17227): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sentaca.android.accordion/com.sentaca.android.accordion.My_Project}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.os.Handler.dispatchMessage(Handler.java:99)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.os.Looper.loop(Looper.java:123)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-17 14:33:50.531: E/AndroidRuntime(17227): at java.lang.reflect.Method.invokeNative(Native Method)
06-17 14:33:50.531: E/AndroidRuntime(17227): at java.lang.reflect.Method.invoke(Method.java:507)
06-17 14:33:50.531: E/AndroidRuntime(17227): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-17 14:33:50.531: E/AndroidRuntime(17227): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-17 14:33:50.531: E/AndroidRuntime(17227): at dalvik.system.NativeStart.main(Native Method)
06-17 14:33:50.531: E/AndroidRuntime(17227): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-17 14:33:50.531: E/AndroidRuntime(17227): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
06-17 14:33:50.531: E/AndroidRuntime(17227): at java.util.ArrayList.get(ArrayList.java:311)
06-17 14:33:50.531: E/AndroidRuntime(17227): at com.sentaca.android.accordion.My_Project.onCreate(My_Project.java:69)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-17 14:33:50.531: E/AndroidRuntime(17227): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
06-17 14:33:50.531: E/AndroidRuntime(17227): ... 11 more
答案 0 :(得分:1)
你在下一行得到java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
:
dtrProjectNAmeSize=new String[dispDataList.size()];
strProjectame=(String[])dispDataList.get(0); // error happened here
strdateCreated=(String[]) dispDataList.get(1);
strEndDate = (String[])dispDataList.get(2);
strIsActive = (String[])dispDataList.get(3);
因为dispDataList
的大小为0
所以您无法得到任何索引,因此您可以使用以下代码更改代码:
dtrProjectNAmeSize=new String[dispDataList.size()];
if ( dispDataList.size() > 3 )
{
strProjectame=(String[])dispDataList.get(0);
strdateCreated=(String[]) dispDataList.get(1);
strEndDate = (String[])dispDataList.get(2);
strIsActive = (String[])dispDataList.get(3);
}