How to display a "Loading..." text while retrieving items for a ListView

ggomeze picture ggomeze · Jul 26, 2010 · Viewed 15.4k times · Source

There are some others applications doing this, like Twitter, Facebook, or even native applications such as Android Market. When you want to display a list of items retrieved from the internet, this looks like a standard way for displaying the user some notification about action in progress. This is a white background screen with an animated spinning wheel and a "Loading..." text.

Does somebody know how to do this?

I've been able to do something similar with this code, but I don't like it too much yet. Still work in progress:

<ListView android:id="@+id/post_list" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

   <TextView android:id="@android:id/loading" 
       android:background="@color/white"
       android:layout_width="fill_parent"     
       android:layout_height="fill_parent" 
       android:gravity="center" android:text="Loading..." />

Answer

Pentium10 picture Pentium10 · Jul 26, 2010

That's done with the help of AsyncTask (an intelligent backround thread) and ProgressDialog

When the AsyncTask starts we reaise a progressdialog with indeterminate state, once the task is finished we dismiss the dialog.

Example code
What the adapter does in this example is not important, more important to understand that you need to use AsyncTask to display a dialog for the progress.

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();
    }
}