2012-03-07 7 views
1

Я использую собственный listView Чтобы показать данные из sqlite. Детали элемента будут отображаться в списке. Итак, я попытался установить действие на 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); 
       } 
      }); 

Вот код DataSource:

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

+0

проверьте обновление. – asish

ответ

1

Для этой ошибки была только одна причина. Я принимал значения arrayList (которые имеют значения для listView) внутри пользовательского адаптера.

Простое создание массива в глобальном масштабе и загрузка всех значений в onResume() устраняют проблему. Вот и все, я никогда не получал ошибку arrayOutOfBound.

0

Если вы используете BD для заполнения ListView, вам нужно открыть его и указатель перед отображением списка на экране, например метод onResume() Activity (или ListActivity).

Использование getRedableDatabase() из SQLiteOpenHelper

более подробной информации: http://developer.android.com/guide/topics/data/data-storage.html

не имеют, чтобы закрыть курсор, пока метод OnPause().

+0

уже сделали это, все еще получая эти ошибки. – asish

+0

проверить обновление. не нужно закрывать курсор! – sabadow

+0

открыли курсор в onCreate и OnResume, закрыты в onPause и onStop. – asish

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

+0

ok .. то где еженедельно источник в вашем коде? Вставьте эту часть кода тоже .. – 5hssba

+0

вставьте код. – asish

Смежные вопросы