从子活动返回后清空CursorLoader

时间:2015-04-16 16:38:48

标签: android android-cursorloader

我的活动有两个加载器:第一个获取一些元数据,另一个在查询中使用这些数据来获取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的操作栏中的那个(不是系统导航栏中的后退按钮)。

1 个答案:

答案 0 :(得分:1)

更改

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

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

因为加载器已经创建,因此不会再创建它,它必须重新启动。