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的操作欄中的一個(不是系統導航欄中的後退按鈕)。
正如我所說,它有兩個裝載機,在這裏你指着第二個工作正常,如果第一個返回數據。這裏的問題是,第一個不返回數據... – vk23
也如果第一個重新加載你有第二個問題,添加'.forceload();'第一個。 – mmlooloo
我嘗試過forceload()之前,它沒有幫助。 – vk23