2013-12-15 51 views
0

我有一个主要活动,它有一个列表视图。 列表视图项目使用LoaderManager加载。Attemp重新打开一个已经关闭的对象android.database.sqlite

当我在列表视图中单击某个项打开其他的活动,显示更多信息 (与“startActivityForResult”)

的问题是:

当我回去(使用回车键)从显示信息的活动到主要活动,然后再次单击我得到一个异常 - 试图重新打开一个已经关闭的对象。

,但如果我从活动回去(显示详细信息)和一个按钮,我提出有(实际上是“完成()”)的主要活动,然后再cllick然后我得到也不例外

有人知道是什么问题?

谢谢!

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

UPDATE:FIXED IT。我将此方法添加到我的主要活动中。

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

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

为什么你将游标存储为列表视图项?你为什么要在'onItemClick()'中关闭它们? – laalto

+0

我不存储游标。这是如何加载器管理器与列表视图 – user3104022

回答

0

您可以通过创建公共静态字段来实现,但我不会推荐它。您可以将数据存储在共享偏好设置中,然后在需要时进行检索。

+0

我不想创建静态字段。是什么导致问题?这取决于我如何返回到主要活动,但是导致该问题的原因是 – user3104022

+0

问题是,您无法控制删除所有未使用的变量和对象的GC。最好的方法是将它们存储在文件,共享首选项或数据库中,具体取决于要保存的数据量。 – lugonja

相关问题