我的活动有两个加载器:第一个获取一些元数据,另一个在查询中使用这些数据来获取ListView的实际数据。所以,当我开始这项活动时,一切正常。然后我启动子活动来编辑/创建列表元素,当我按下后退按钮时,我再次看到第一个活动,但这次CursorLoader(第一个)返回一个空游标(不是null,只是getCount()= 0)。只有按下后退按钮才会发生这种情况。如果我完成了孩子的活动,一切都很好,就像我第一次开始第一次活动一样。
这是我的活动:
@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);
}
更新:因为我注意到当我在子活动上使用finish()时一切正常,我试图在子活动中覆盖默认操作栏的后退按钮行为:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
return true;
}
}
这样做的伎俩,但它似乎不是一个正确的方法。有什么想法吗?
BTW:后退按钮是指Activity的操作栏中的那个(不是系统导航栏中的后退按钮)。
答案 0 :(得分:1)
更改
getLoaderManager().initLoader(JOURNAL, null, this);
到
getLoaderManager().restartLoader(JOURNAL, null, this);
因为加载器已经创建,因此不会再创建它,它必须重新启动。