2015-04-16 69 views
0

我的活動有兩個加載器:第一個提取一些元數據,另一個在查詢中使用這些數據來獲取ListView的實際數據。所以當我開始這個活動時,一切正常。然後我開始編輯/創建列表元素的子級活動,當我按下後退按鈕時,我再次看到第一個活動,但是這次CursorLoader(第一個)返回空遊標(不爲null,只是getCount()= 0)。只有按下後退按鈕纔會發生這種情況。如果我完成孩子的活動,一切都很好,就好像我第一次開始第一次活動一樣。從子活動返回後的空CursorLoader

這裏是我的活動:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_routine_journal); 

     listView = (ListView) findViewById(R.id.routine_journal_listView); 

     Intent i = getIntent(); 
     routineId = i.getLongExtra("routineId", -1); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     if (id == R.id.action_add_routine_item) { 
      Intent i = new Intent(this, RoutineItemEditActivity.class); 
      i.putExtra("routineId", routineId); 
      i.putParcelableArrayListExtra("fields", fields); 
      startActivity(i); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 

     CursorLoader cursorLoader = null; 

     if (id == FIELDS) { 
      cursorLoader = new CursorLoader(this, 
        TrackerContentProvider.CONTENT_FIELD_URI, 
        FieldTable.getColumns(), 
        FieldTable.COLUMN_ROUTINE + " = ?", 
        new String[]{routineId + ""}, 
        null); 

     } else if (id == JOURNAL) { 
      String query = getQuery(); 
      Log.d("VK", "query=" + query); 
      cursorLoader = new CursorLoader(this, 
        TrackerContentProvider.CONTENT_ROUTINE_ITEM_URI, 
        null, 
        null, 
        null, 
        query); 
     } 

     return cursorLoader; 
    } 

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

     getLoaderManager().restartLoader(FIELDS, null, this); 
    } 

    @Override 
    public void onLoadFinished(Loader loader, Cursor data) { 

     int loaderId = loader.getId(); 

     if (loaderId == FIELDS) { 
      storeFields(data); 
     } else if (loaderId == JOURNAL) { 
      cursorAdapter.swapCursor(data); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader loader) { 
     cursorAdapter.swapCursor(null); 
    } 

    private void storeFields(Cursor c) { 

     if (c == null) return; 

     if (c.moveToFirst()) { 
      FieldItem fieldItem; 
      do { 
       long id = c.getLong(c.getColumnIndex(FieldTable.COLUMN_ID)); 
       String name = c.getString(c.getColumnIndex(FieldTable.COLUMN_NAME)); 
       String type = c.getString(c.getColumnIndex(FieldTable.COLUMN_TYPE)); 
       boolean active = c.getInt(c.getColumnIndex(FieldTable.COLUMN_ACTIVE)) != 0; 
       long rid = c.getLong(c.getColumnIndex(FieldTable.COLUMN_ROUTINE)); 

       fieldItem = new FieldItem(id, name, type, active, rid); 
       fields.add(fieldItem); 

      } while (c.moveToNext()); 
     } 

     cursorAdapter = new RoutineCursorAdapter(getBaseContext(), null, 0); 
     cursorAdapter.setFields(fields); 
     listView.setAdapter(cursorAdapter); 

     getLoaderManager().initLoader(JOURNAL, null, this); 
    } 

更新:因爲我發現一切正常,當我用對孩子的活動結束()我試圖重寫子活動的默認操作欄的後退按鈕行爲:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) { 
     finish(); 
     return true; 
    } 
} 

這樣做的竅門,但它似乎不是一個正確的方法。有任何想法嗎?

順便說一句:通過後退按鈕我指的是在Activity的操作欄中的一個(不是系統導航欄中的後退按鈕)。

回答

1

變化

getLoaderManager().initLoader(JOURNAL, null, this); 

getLoaderManager().restartLoader(JOURNAL, null, this); 

因爲裝載機已經創建的,因此不會再次創建它,它必須重新啓動。

+0

正如我所說,它有兩個裝載機,在這裏你指着第二個工作正常,如果第一個返回數據。這裏的問題是,第一個不返回數據... – vk23

+0

也如果第一個重新加載你有第二個問題,添加'.forceload();'第一個。 – mmlooloo

+0

我嘗試過forceload()之前,它沒有幫助。 – vk23