【问题标题】:How to get rid of empty view screen which appears every time i resume activity?如何摆脱每次我恢复活动时出现的空白视图屏幕?
【发布时间】:2013-01-01 23:40:20
【问题描述】:

我的主要活动中有一个 SimpleCursorAdapter 和一个列表。当数据库中没有项目时,我设置了一个 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);

}

【问题讨论】:

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


    【解决方案1】:

    如果您使用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);
    
    }
    

    【讨论】:

    • 我正在使用一个包含列表的活动。
    • @user1971924 然后你可以在 ListView 上使用setVisibility(GONE)setVisibility(VISIBLE)
    【解决方案2】:

    问题似乎是线程问题,您触发 AsyncTask 并且您的 onResume 完成,然后在您等待 AyncTask 完成时您的视图是空白的。

    想到的一个修复方法是在 Activity 生命周期的早期触发 AsyncTask(例如 onCreate 或 onStart 方法),这可能会在第一次加载时及时为您提供结果。

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

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

    【讨论】:

    • 我有另一个活动,我将项目添加到列表中。一旦这个 addItem 活动完成,就会出现 Main Activity(带有列表的那个)。因此,由于列表经常更改,因此我不能在 onCreate 或 onStart 中拥有列表。我会尝试使用 onPre 和 onPostExecute 方法。
    • 我在 onPre 方法中尝试了加载微调器。但是 UI 是 onPre,然后是 emptyView,然后是 List。需要想办法将旧光标传递给 onResume 方法。
    • 抱歉,澄清一下,你在 onPre 中启动微调器,在 onPost 中取消它,到那时你的处理就全部完成了
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2014-03-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多