listView更新

时间:2017-01-16 09:44:16

标签: android

我创建了一个简单的数据库,我可以成功写入和读取。

现在我想在我写下数据时立即在屏幕上显示它。

我尝试使用Thread并调用thread.start();它无法正常工作

我想错过哪一步?任何帮助都会感激不尽。

这是我在listView中的线程代码,它位于main onCreate

Thread thread=new Thread(new Runnable() {
        @Override
        public void run() {
            sqlForBloodSugar = new MySqlForBloodSugar(BloodSugarReportActivity.this, "bloodSugar.db", null, 1);

            Cursor cursor = sqlForBloodSugar.getReadableDatabase().query("blood", null, null, null, null, null, null);

            SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(
                    BloodSugarReportActivity.this,
                    R.layout.blood_sugar_report_list_item_layout,
                    cursor,
                    new String[]{"_id", "bloodvalue", "eattime", "blooddate"},
                    new int[]{R.id.item_id, R.id.item_bloodSugar, R.id.item_eatTime, R.id.item_date},
                    0);

            listViewBloodReport.setAdapter(simpleCursorAdapter);
            simpleCursorAdapter.notifyDataSetChanged();
        }
    });
    thread.start();

2 个答案:

答案 0 :(得分:0)

我认为您从其他线程更新UI元素时遇到问题。 如果存在一些错误消息,请告诉我们。

要从其他线程更新UI元素,您必须使用 runOnUiThread

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                //Do something on UiThread
            }
        });

答案 1 :(得分:0)

你应该在AsyncTask(智能背景线程)和ProgressDialog

的帮助下完成这项工作

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,分别称为begin,doInBackground,processProgress和end。

4个步骤

执行异步任务时,任务将经历4个步骤:

onPreExecute(),在执行任务后立即在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递给此步骤。计算结果必须由此步骤返回,并将传递回最后一步。此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单元。这些值发布在UI线程的onProgressUpdate(Progress ...)步骤中。

onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。执行的时间是不确定的。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。

onPostExecute(Result),在后台计算完成后在UI线程上调用。背景计算的结果作为参数传递给该步骤。线程规则

此类必须遵循一些线程规则才能正常工作:

必须在UI线程上创建任务实例。必须在UI线程上调用execute(Params ...)。不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)

示例代码: 适配器在此示例中的作用并不重要,更重要的是要了解您需要使用AsyncTask来显示进度的对话框。

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > {
    ProgressDialog dialog;
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(viewContacts.this);
        dialog.setMessage(getString(R.string.please_wait_while_loading));
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }
    /* (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected ContactsListCursorAdapter doInBackground(Void... params) {
        cur1 = objItem.getContacts();
        startManagingCursor(cur1);

        adapter1 = new ContactsListCursorAdapter (viewContacts.this,
                R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {});

        return adapter1;
    }

    protected void onPostExecute(ContactsListCursorAdapter result) {
        list.setAdapter(result);
        dialog.dismiss();
    }
}