尝试重新打开已关闭的对象android.database.sqlite

时间:2013-12-15 09:19:44

标签: android sqlite listview loader android-loadermanager

我有一个Main活动,它有一个列表视图。 列表视图项目使用LoaderManager加载。

当我点击列表视图中的项目时,我打开另一个显示更多信息的活动 (使用“startActivityForResult”)

问题是:

当我从显示信息到主活动的活动返回(使用返回键)然后再次单击时我得到一个例外 - 尝试重新打开已经关闭的对象。

但如果我从那个活动(显示更多信息)回来,我在那里做了一个Button(实际上是“finish()”)到主活动然后再次点击,那么我没有异常

任何人都知道这是什么问题?

谢谢!

private void display_listview()
    {
        // create an adapter from the SimpleCursorAdapter
        dataAdapter = new SimpleCursorAdapter(
                this,
                R.layout.row_invite_layout,
                null,
                columns,
                to,
                0);

        // Assign adapter to ListView
        listView.setAdapter(dataAdapter);

        //Ensures a loader is initialized and active.
        getSupportLoaderManager().initLoader(0, null, this);


        //add implementation to listview item click
        listView.setOnItemClickListener(new OnItemClickListener() 
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id)
            {

                Cursor cursor = (Cursor) listView.getItemAtPosition(position);

                IInvite invite = LoadFromCursor(cursor);

                cursor.close();

                mUpdateFlag = true;

                if(!mTrashFlag) // Trash Can is turned off
                {
                    Intent intent = new Intent(getApplicationContext(), InviteViewActivity.class);
                    intent.putExtra("invite",(Invite)invite);
                    startActivityForResult(intent, INVITE_REQUEST_ID);
                }
                else // Trash Can is turned on
                {
                    getContentResolver().delete(InviteContentProvider.CONTENT_URI, SQLdataHelper.KEY_ROWID+"="+invite.getID(), null);
                    ExtraDelete(invite);
                    getSupportLoaderManager().getLoader(0).forceLoad();
                }


            }
        });
    }


    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data)
    {
        // Swap the new cursor in.  (The framework will take care of closing the
        // old cursor once we return.)
        dataAdapter.swapCursor(data);

    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) 
    {
        dataAdapter.swapCursor(null);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args)
    {
        String[] projection = {
                SQLdataHelper.KEY_ROWID,
                SQLdataHelper.INVITE_CLIENT_ID,
                SQLdataHelper.INVITE_CREATION_DATE,
                SQLdataHelper.INVITE_NAME,
                SQLdataHelper.INVITE_NOTE,
                SQLdataHelper.INVITE_REQUESTED_DATE,
                SQLdataHelper.INVITE_TOTAL_PRICE,
                SQLdataHelper.INVITE_STATUS
        };
        CursorLoader cursorLoader = new CursorLoader(this,
                InviteContentProvider.CONTENT_URI, projection, null, null, null);
        return cursorLoader;
    }

更新:修复它。我将此方法添加到我的主要活动中..

@Override
public void onResume()
{
    super.onResume();

    getSupportLoaderManager().getLoader(0).forceLoad();
}

1 个答案:

答案 0 :(得分:0)

您可以通过创建公共静态字段来实现,但我不推荐它。您可以将数据存储在共享首选项中,然后随时检索它。