2010-11-20 3 views
0

У меня есть чрезвычайно сложный список в моем приложении, с данными, полученными из Интернета и т. Д. Какова наилучшая практика для предварительной загрузки как можно большего количества ListView, так что она появляется сразу на экране?Android: активность в предзагрузке

Например, стандартное приложение для Android и Android показывает белый экран с вращающимся загрузчиком и «Загрузка ...» до того, как будет показан разговор. Я действительно не могу найти это в исходном коде Android, но я думаю, что это дополнительная загрузка. Активность, выполняющая некоторое кэширование и передача в сеанс Activity, используя функцию finish(), чтобы не отображалась анимация смены экрана.

Как я могу предварительно загрузить или кешировать элементы ListView? Возможно ли это сделать?

Спасибо! С наилучшими пожеланиями, Ян Оливер

ответ

1

Это делается с помощью AsyncTask (умного фона нити) и ProgressDialog

Когда AsyncTask начинает мы поднимаем progressdialog с неопределенным состоянием, как только задача закончена, мы закрыть диалоговое окно.

Пример кода
Что адаптер делает в этом примере не важно, что более важно, чтобы понять, что вам нужно использовать 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(); 
    } 
} 
+0

Уважаемый Pentium10! Благодарим за ответ! Это может мне очень помочь, хотя трудоемкая часть моего приложения - это призывы к методу getView() ListAdapter. Но так или иначе: не обязательно ли предоставить адаптер для ListView в методе onCreate? Как они это сделали здесь? С пустым списком или чем-то еще? Кроме того, этот белый экран с анимацией загрузки - это просто Progressdialog, покрывающий весь экран? Заранее спасибо! – janoliver

+0

Вы можете предоставить адаптер в списке, даже если он пуст. Затем вы можете добавить элементы позже, и вы можете вызвать событие notifyDatasetChanged, чтобы обновить ListView. Вы можете кэшировать свои представления в некотором объекте класса для последующего использования. – Pentium10