2013-04-18 15 views
5

Quale modo migliore di mostrare un indicatore di avanzamento mentre il mio listview non è pieno di dati del database?Mostra indicatore di avanzamento prima di riempire listview utilizzando CursorLoader

Ho trovato alcuni esempi su come eseguire questa operazione, utilizzando assynctask, ma nel mio caso, sto usando Loader/CursorLoader.

public class TestActivity extends SherlockFragmentActivity implements 
    LoaderCallbacks<Cursor> { 

SimpleCursorAdapter mAdapter; 
ListView mListView; 

private static final String[] UI_BINDING_FROM = new String[] { 
     TestDBAdapter.KEY_NAME, TestDBAdapter.KEY_ICON }; 

private static final int[] UI_BINDING_TO = new int[] { R.id.text, R.id.icon }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_Test); 

    mListView = (ListView) findViewById(R.id.listview); 

    mAdapter = new TestAdapter(getApplicationContext(), 
      R.layout.list_item_Test, null, UI_BINDING_FROM, 
      UI_BINDING_TO, 0); 

    mListView.setAdapter(mAdapter); 

    getSupportLoaderManager().initLoader(0, null, this); 

} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 


    Uri uri = ContentProviderTest.CONTENT_URI; 

    CursorLoader cursorLoader = new CursorLoader(
      this, 
      uri, 
      null, 
      null, 
      null, 
      null); 

    return cursorLoader; 

} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.swapCursor(null); 
} 
} 

Una possibile soluzione, potrebbe essere quella di creare una nuova classe che estende ListFragment e utilizzare il metodo setListShown(), ma non so se è il modo migliore per risolvere questo problema.

Grazie

risposta

13

Aggiungere una piccola ProgressBar al file di layout, con la sua visibilità impostato su "andato". Appena prima di creare il tuo CursorLoader, imposta la sua visibilità su "visibile". Apparirà. In onLoadFinished, imposta la visibilità di ProgressBar su "gone". Scomparirà e verrà caricato il tuo ListView.

Vorrei utilizzare la barra di avanzamento di stile piccolo. Per ulteriori informazioni su questo, consultare i documenti di riferimento per android.widget.ProgressBar.

BTW, la visibilità è controllata con View.setVisibility.

+0

La tua risposta mi ha aiutato a ottenere [questo esempio] (http://stackoverflow.com/questions/12559461/how-to-show-progress-barcircle-in-an-activity-having-a-listview-before-loading/12559601 # 12559601). Credo che questo sia il modo più semplice. Grazie – elirigobeli

0

Oltre alla risposta giusta: è una buona idea in onLoadFinished() di avere questo controllo:

if (cursor.getCount() > 0) { 
    getView().findViewById(R.id.loadingPanel).setVisibility(View.GONE); 
    getView().findViewById(android.R.id.list).setVisibility(View.VISIBLE); 
} 

In caso contrario, in caso di affidamento sulla vostra curstom Service per riempire il db con i dati, il cursore può essere vuoto e il risultato non sarebbe una barra di avanzamento né l'elenco con gli elementi visualizzati.

+0

La visualizzazione infinita del caricatore non è una buona idea, mostra invece il messaggio corretto "Record not found" quando getCount() == 0 –

0

Ho un costumCursorAdapter in un listView.

Ho anche un cursoreLoader per scambiare costumCursorAdapter quando i dati vengono modificati nel database. I dati DB vengono inseriti da una ricerca avviata dall'utente.

Nessuno di questi consigli lavorava, Google è stato di alcun aiuto - niente fermato la barra di avanzamento, una volta impostato visibile- i.e. progress_bar.setVisibility(View.Gone);

Alla fine, come un semplice e 'solo per la società' sulotion-

  1. Ho creato una variabile globale per agire come contatore int count = 0. Viene reimpostato a 0 ad ogni ricerca (nel metodo onClick di un pulsante).
  2. Nel bindView di CustomAdapter, nella parte inferiore di questo blocco di codice, ho iniziato il conteggio con count ++.
  3. Nella parte superiore del blocco di codice a verificare se il conteggio ha raggiunto 4. Se lo è, ho nascondere la barra di avanzamento:

     if (count==4){ 
         pb.setVisibility(View.GONE); 
        } 
    
  4. In questo modo, quando la customAdapter lega il quarto vista, lo so è risonabile fermare la barra di avanzamento.

  5. Non ho mai meno di 4 elementi nell'elenco.

Spero che questo aiuti qualcuno.

Problemi correlati