Ошибка в пользовательском ListView onitemClick

1

Я использую собственный listView. Показывать данные из sqlite. Детали элемента будут отображаться в списке. Итак, я попытался установить действие в ListItemClicked, затем я получил некоторую ошибку.

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? с БД? напишите код пожалуйста.
  • 0
    проверьте обновление.
Теги:
android-listview

4 ответа

1
Лучший ответ

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

Просто сделав globalList global и загрузив все значения в onResume(), исправлена проблема. Что это, я никогда не получал ошибку arrayOutOfBound снова.

0

Я думаю, что вам не хватает этой части в классе "WeeklyDtaSource"

public class WeeklyDataSource {
.....
public void open() throws SQLException{
weeklydb =WeeklySqliteOpenHelper.getWritableDtabase();
}
.....
}
  • 0
    также сделал это, проверьте обновление.
  • 0
    хорошо .. тогда где еженедельный источник данных в вашем коде ?? вставить эту часть кода также ..
Показать ещё 1 комментарий
0

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

Использовать getRedableDatabase() SQLiteOpenHelper

Дополнительная информация: http://developer.android.com/guide/topics/data/data-storage.html

И не нужно закрывать курсор до метода onPause().

  • 0
    уже сделали это, все еще получая эти ошибки.
  • 0
    проверьте обновление. не нужно закрывать курсор !!
Показать ещё 1 комментарий
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню