asish
asish

Reputation: 4807

Error in Custom ListView onitemClick

I'm using a custom listView To show data from sqlite. Details of the item will be shown on listItem clicked. So, I tried to set action on ListItemClicked, Then I got some error Like

database not Open and arrayIdexOutOfBound

Then I set a click listener on row(the view of list item). It works fine. But If I click instantly I got error like:

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)

I'm not any expert or experienced. I just don't understand this errors.

The code where I set the 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);
                }
            });

Here is the code of 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;
    }
}

My question is why this happening(the errors) ?

any Idea to solve this errors would be greatly helpful.

Thanks.

Upvotes: 1

Views: 342

Answers (4)

asish
asish

Reputation: 4807

There was only one reason for this errors. I was taking arrayList(which have the values for listView) value inside the custom adapter.

Just making the arrayList global and loading all values in onResume() fixed the problem. That's it, I never got arrayOutOfBound error again.

Upvotes: 1

5hssba
5hssba

Reputation: 8079

I think you are missing this part in your "WeeklyDtaSource" class

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

Upvotes: 0

sabadow
sabadow

Reputation: 5153

If you use a BD to fill the ListView, you need to open it and the cursor before the list is shown in screen, for example onResume() method of Activity (or ListActivity).

Use getRedableDatabase() of SQLiteOpenHelper

more info: http://developer.android.com/guide/topics/data/data-storage.html

And don't have to close the cursor until the onPause() method.

Upvotes: 0

Soham
Soham

Reputation: 4960

If I understood your question correctly, you want something to happen when a row in the ListView is clicked. Here is what I do for such a case, I set on onItemClickListener on the 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

For more information check out this example: http://www.vogella.de/articles/AndroidListView/article.html#listview_adapterlistener

Upvotes: 0

Related Questions