Ошибка в пользовательском ListView onitemClick - PullRequest
1 голос
/ 07 марта 2012

Я использую собственный 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);
                }
            });

Вот код источника данных:

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;
    }
}

МойВопрос в том, почему это происходит (ошибки)?

Любая идея для устранения этой ошибки была бы очень полезной.

Спасибо.

Ответы [ 4 ]

1 голос
/ 09 марта 2012

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

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

0 голосов
/ 07 марта 2012

Если я правильно понял ваш вопрос, вы хотите, чтобы что-то происходило при щелчке строки в 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 голосов
/ 07 марта 2012

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

public class WeeklyDataSource {
.....
public void open() throws SQLException{
weeklydb =WeeklySqliteOpenHelper.getWritableDtabase();
}
.....
}
0 голосов
/ 07 марта 2012

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

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

подробнее: http://developer.android.com/guide/topics/data/data-storage.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...