2012-03-07 32 views
1

我正在使用自定義listView顯示來自sqlite的數據。該項目的詳細信息將顯示在listItem點擊。所以,我試圖設置ListItemClicked動作,然後我得到了一些錯誤,如自定義ListView中的錯誤onitemClick

database not Open and arrayIdexOutOfBound 

然後我設置排點擊監聽器(列表項的視圖)。它工作正常。但如果我立即點擊,我得到如下錯誤:

03-07 17:11:51.223: E/AndroidRuntime(789): FATAL EXCEPTION: main 
03-07 17:11:51.223: E/AndroidRuntime(789): java.lang.IllegalStateException: database not open 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1224) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264) 
03-07 17:11:51.223: E/AndroidRuntime(789): at (WeeklyDataSource.java:101) 
03-07 17:11:51.223: E/AndroidRuntime(789): at l(WeeklyActivity.java:112) 
03-07 17:11:51.223: E/AndroidRuntime(789): at .getCount(WeeklyActivity.java:120) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:157) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.widget.ListView.dispatchDraw(ListView.java:2991) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.View.draw(View.java:6846) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.widget.AbsListView.draw(AbsListView.java:2257) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.View.draw(View.java:6743) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.View.draw(View.java:6743) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.widget.FrameLayout.draw(FrameLayout.java:352) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.View.draw(View.java:6743) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.widget.FrameLayout.draw(FrameLayout.java:352) 
03-07 17:11:51.223: E/AndroidRuntime(789): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewRoot.draw(ViewRoot.java:1407) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewRoot.performTraversals(ViewRoot.java:1163) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.os.Looper.loop(Looper.java:123) 
03-07 17:11:51.223: E/AndroidRuntime(789): at android.app.ActivityThread.main(ActivityThread.java:4627) 
03-07 17:11:51.223: E/AndroidRuntime(789): at java.lang.reflect.Method.invokeNative(Native Method) 
03-07 17:11:51.223: E/AndroidRuntime(789): at java.lang.reflect.Method.invoke(Method.java:521) 
03-07 17:11:51.223: E/AndroidRuntime(789): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
03-07 17:11:51.223: E/AndroidRuntime(789): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
03-07 17:11:51.223: E/AndroidRuntime(789): at dalvik.system.NativeStart.main(Native Method) 

我不是任何專家或經驗豐富。我只是不明白這個錯誤。

在哪裏設置row.onclickListener

row.setOnClickListener(new View.OnClickListener() 
      { 

       public void onClick(View v) 
       { 
        Gson gson = new Gson(); 
        WeeklySchedule schedule = (WeeklySchedule) getItem(position); 

        String string = gson.toJson(schedule); 
        Intent intent = new Intent(WeeklyActivity.this, 
          AddWeeklySchedule.class); 
        intent.putExtra("GSON", string); 
        startActivity(intent); 
       } 
      }); 

這裏是數據源的代碼代碼:

public class WeeklyDataSource 
    { 
     private static final String TAG = "WeeklyDataSource"; 

    private SQLiteDatabase weeklydb; 
    private WeeklySqliteOpenHelper dbHelper; 
    private Cursor cursor; 

    // private Context context; 

    public WeeklyDataSource(Context context) 
    { 
     // this.context = context; 
     dbHelper = new WeeklySqliteOpenHelper(context); 
    } 

    public void open() throws SQLException 
    { 
     weeklydb = dbHelper.getWritableDatabase(); 
    } 

    public void close() 
    { 
     weeklydb.close(); 
    } 

    public boolean createSchedule(WeeklySchedule weekly) 
    { 
     ContentValues cv = new ContentValues(); 
     int i = 1; 
     String[] s = WeeklySqliteOpenHelper.getAllcoulumn(); 
     cv.put(s[i++], weekly.getStartDate()); 
     cv.put(s[i++], weekly.getEndDate()); 
     cv.put(s[i++], weekly.getMondayHour()); 
     cv.put(s[i++], weekly.getTuesdayHour()); 
     cv.put(s[i++], weekly.getWednesdayHour()); 
     cv.put(s[i++], weekly.getThusdayHour()); 
     cv.put(s[i++], weekly.getFridayHour()); 

     weeklydb.insert(WeeklySqliteOpenHelper.getWeeklyTableName(), null, cv); 

     // Cursor cursor = weeklydb.query(
     // WeeklySqliteOpenHelper.getWeeklyTableName(), s, s[0] + " = " 
     // + insertId, null, null, null, null); 
     // cursor.moveToFirst(); 
     // cursorToWeeklySchedule(cursor); 
     return true; 
    } 

    public boolean updateSchedule(WeeklySchedule weekly) 
    { 
     ContentValues cv = new ContentValues(); 
     int i = 1; 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], 
       weekly.getStartDate()); 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], weekly.getEndDate()); 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], 
       weekly.getMondayHour()); 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], 
       weekly.getTuesdayHour()); 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], 
       weekly.getWednesdayHour()); 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], 
       weekly.getThusdayHour()); 
     cv.put(WeeklySqliteOpenHelper.getAllcoulumn()[i++], 
       weekly.getFridayHour()); 
     weeklydb.update(
       WeeklySqliteOpenHelper.getWeeklyTableName(), 
       cv, 
       WeeklySqliteOpenHelper.getAllcoulumn()[0] + "=" 
         + weekly.get_id(), null); 
     return true; 
    } 

    public boolean deleteSchedule(WeeklySchedule schedule) 
    { 
     System.out.println("Subject deleted with id: " + schedule.get_id()); 
     weeklydb = dbHelper.getWritableDatabase(); 
     weeklydb.delete(WeeklySqliteOpenHelper.getWeeklyTableName(), 
       SubjectSqliteOpenHelper.KEY_ROWID + " = " + schedule.get_id(), 
       null); 
     return false; 
    } 

    public ArrayList<WeeklySchedule> getAllSchedule() 
    { 
     ArrayList<WeeklySchedule> allSchedule = new ArrayList<WeeklySchedule>(); 
     cursor = weeklydb.query(WeeklySqliteOpenHelper.getWeeklyTableName(), 
       WeeklySqliteOpenHelper.getAllcoulumn(), null, null, null, null, 
       null); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) 
     { 
      allSchedule.add(cursorToWeeklySchedule(cursor)); 
      cursor.moveToNext(); 
     } 
     cursor.close(); 
     return allSchedule; 
    } 

    public WeeklySchedule cursorToWeeklySchedule(Cursor cursor) 
    { 
     WeeklySchedule schedule = new WeeklySchedule(cursor.getString(1), 
       cursor.getString(2), cursor.getString(3), cursor.getString(4), 
       cursor.getString(5), cursor.getString(6), cursor.getString(7)); 
     schedule.set_id(cursor.getLong(0)); 
     return schedule; 
    } 
} 

我的問題是,爲什麼這種情況發生(錯誤)?

任何想法來解決這個錯誤將是非常有益的。

謝謝。

+0

你是如何填充ListView的?與數據庫?請張貼代碼。 – sabadow 2012-03-07 10:32:01

+0

檢查更新。 – asish 2012-03-07 11:13:24

回答

1

這個錯誤只有一個原因。我正在自定義適配器內部使用arrayList(它具有listView的值)值。

只是使arrayList全局並加載onResume()中的所有值解決了問題。就是這樣,我再也沒有得到arrayOutOfBound錯誤。

0

如果使用BD來填充ListView,則需要將其打開並在列表顯示之前將光標顯示在屏幕上,例如Activity(或ListActivity)的onResume()方法。的SQLiteOpenHelper

更多信息

使用getRedableDatabase():http://developer.android.com/guide/topics/data/data-storage.html

而不必關閉遊標,直到在onPause()方法。

+0

已經完成了,仍然得到這些錯誤。 – asish 2012-03-07 10:37:59

+0

檢查更新。不必關閉光標! – sabadow 2012-03-07 10:41:53

+0

已在onCreate和OnResume中打開光標,在onPause和onStop中關閉。 – asish 2012-03-07 10:53:30

0

如果我正確理解您的問題,您希望點擊ListView中的某行時發生某些事情。以下是我對這樣的情況下做的,我就onItemClickListener設置ListView控件

myListView.setOnItemClickListener(new OnItemClickListener() { 
@Override 
     public void onItemClick(AdapterView<?> av, View view, int position, long arg3) { 
     //do your processing on the item here based on the position variable 

欲瞭解更多信息,請查看下面的例子:http://www.vogella.de/articles/AndroidListView/article.html#listview_adapterlistener

0

我認爲你缺少這部分在「WeeklyDtaSource」級

public class WeeklyDataSource { 
..... 
public void open() throws SQLException{ 
weeklydb =WeeklySqliteOpenHelper.getWritableDtabase(); 
} 
..... 
} 
+0

也做到了這一點,檢查更新。 – asish 2012-03-07 11:12:25

+0

確定..那麼你的代碼裏的weeklydatasource是哪裏?粘貼那部分代碼也是.. – 5hssba 2012-03-07 11:17:37

+0

粘貼代碼。 – asish 2012-03-07 11:46:41