如何摆脱每次恢复活动时出现的空视图屏幕?

时间:2013-01-18 09:31:46

标签: android listview user-interface android-asynctask simplecursoradapter

我的主要活动中有一个SimpleCursorAdapter和一个List。当数据库中没有项目时,我设置了一个emptyView。但AsyncTask每次为onResume创建一个新列表。所以我在列表加载之前得到一个小秒的emptyView屏幕。现在我需要AsyncTask,因为数据查询必须在单独的线程上运行。但我不喜欢每次都会弹出emptyView。我已经在下面附加了我的AsyncTask和onResume方法。两者都在编译。我该怎么做呢?

class GetItems extends AsyncTask<Object, Void, Cursor> {
    DbHelper dbHelper = new DbHelper (MainActivity.this);

    @Override
    protected Cursor doInBackground(Object... params) {
        dbHelper.open();
        return dbHelper.getAllItems();
    }

    @Override
    protected void onPostExecute(Cursor result) {
        adapter.changeCursor(result);
        dbHelper.close();
    }

}

@Override
protected void onResume() {
    super.onResume();
    new GetItems().execute((Object[]) null);

}

2 个答案:

答案 0 :(得分:0)

如果您使用ListFragment,可以在任务开始时调用setListShown(false),这会显示加载微调器。在任务结束时,您调用setListShown(true),然后根据任务结果调用setEmptyText()放置一些错误消息或空消息。

或简单的开关可见性:

class GetItems extends AsyncTask<Object, Void, Cursor> {
    DbHelper dbHelper = new DbHelper (MainActivity.this);

    @Override
    protected void onPreExecute() {
        myListView.setVisibility(View.GONE)
    }

    @Override
    protected Cursor doInBackground(Object... params) {
        dbHelper.open();
        return dbHelper.getAllItems();
    }

    @Override
    protected void onPostExecute(Cursor result) {
        adapter.changeCursor(result);
        myListView.setVisibility(View.VISIBLE);
        dbHelper.close();
    }

}

@Override
protected void onResume() {
    super.onResume();
    new GetItems().execute((Object[]) null);

}

答案 1 :(得分:0)

这个问题似乎是一个线程化的东西,你在那里触发了AsyncTask并且onResume完成了,那么你在等待AyncTask完成时你的视图是空白的。

我想到的一个解决方法是在Activity生命周期的早期启动AsyncTask(例如onCreate或onStart方法),这可能会在第一次加载时及时获得结果。

然后您可以存储检索到的结果,如果用户只是导航然后返回而没有销毁活动,您可以加载旧列表,然后在使用AsyncTask检索更新的列表后刷新它。 / p>

修改 另一个简单的解决方法是在AsyncTask的onPreonPostExecute方法中放置一个进度对话框,这将使UI线程阻塞,直到检索到结果,但是闪烁的进度对话框可能会比空白屏幕更刺耳