2012-12-04 18 views
5

Ho una vista con EditText, Button e ListView. Il pulsante onClick() analizza un sito (questa parte funziona correttamente), ma ci vuole un po 'di tempo per visualizzare le informazioni analizzate in ListView, quindi voglio visualizzare il piccolo ProgressBar sul posto, dove il ListView dovrebbe aver luogo dopo un po'.Come visualizzare una barra di avanzamento su una vista mentre si lavora?

Così, aggiungo questo per il mio layout (scrivo parte importante qui):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/layout1" 
     android:weightSum="1.0"> 

     <EditText 
      android:layout_width="0px" 
      android:layout_height="wrap_content" 
      android:layout_weight=".86" /> 

     <ImageButton 
      android:layout_height="match_parent" 
      android:layout_width="0px" 
      android:layout_weight=".14" /> 

    </LinearLayout> 

    <RelativeLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:layout_below="@id/layout1" 
     android:gravity="center" 
     android:layout_centerInParent="true" 
     android:id="@+id/progressbar" > 

     <ProgressBar 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      style="@android:style/Widget.ProgressBar.Small" /> 

    </RelativeLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/layout1"> 

     <ListView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 

    </RelativeLayout> 

</RelativeLayout> 

Nel codice sorgente:

progressBar = (RelativeLayout) findViewById(R.id.progressbar); 

E ogni volta che desidera visualizzare il ProgressBar, faccio questo :

progressBar.setVisibility(View.VISIBLE); 

per la disattivazione:

progressBar.setVisibility(View.INVISIBLE); 

Ma questo non funziona.

Come posso risolvere questo problema?

+0

* Ma questo non funziona. * - Questo non è molto utile. Cura di spiegare meglio qual è il problema? – Luksprog

+0

Non riesco a vedere alcun 'ProgressBar' visualizzato. Funziona esattamente come ha funzionato senza aggiungere le bazzecole 'ProgressBar'. – azizbekian

+2

D'accordo con Luksprog, ma sarei disposto a indovinare che il tuo parsing sta bloccando (quindi i codici di setvisibilità non sono in esecuzione fino al post-analisi). Ci sono un sacco di modi per risolvere questo problema, ma ti consiglio di effettuare una ricerca per barra di avanzamento e asynctask (ci sono altri modi per farlo, ma in pratica devi avviare un metodo displayprogressbar non bloccante nello stesso momento in cui esegui il tuo l'analisi, quindi nella barra displayprogress controllare il completamento del processo di analisi prima di tornare). – logray

risposta

2

Non c'è bisogno di manipolare la visibilità di s' ProgressBar. ListView ha una funzionalità chiamata "vista vuota" che viene mostrata solo se il tuo ListView è vuoto. Ecco cosa dovete fare per usarlo:

  1. Se la vostra attività si estende ListActivity, utilizzare android:id="@android:id/list" per il vostro ListView e android:id="@android:id/empty" per il vostro ProgressBar.
  2. Se non si estende ListActivity, c'è un metodo setEmptyView() del proprio ListView, che consente di fare la stessa cosa.

Il metodo di cui sopra si adatta meglio se non è necessario svuotare la ListView (ad esempio i dati vengono caricati solo una volta, alla partenza di attività). Se è necessario impostare i dati successivamente, è preferibile utilizzare ViewSwitcher, che ha anche un grande vantaggio: consente di applicare l'animazione di transizione. Per dettagli su ViewSwitcher, dare un'occhiata a this.

0

Provare a utilizzare un'attività asincrona come menzionato sopra.

/** 
* this class performs all the work, shows dialog before the work and dismiss it after 
*/ 
public class ProgressTask extends AsyncTask<String, Void, Boolean> { 

public ProgressTask(ListActivity activity) { 
    this.activity = activity; 
    dialog = new ProgressDialog(context); 
} 

/** progress dialog to show user that the backup is processing. */ 
private ProgressDialog dialog; 
/** application context. */ 
private ListActivity activity; 

protected void onPreExecute() { 
    this.dialog.setMessage("Progress start"); 
    this.dialog.show(); 
} 

    @Override 
protected void onPostExecute(final Boolean success) { 
    if (dialog.isShowing()) { 
     dialog.dismiss(); 
    } 


    //do whatever with your data 
} 

protected Boolean doInBackground(final String... args) { 
    try{  
     //parsing of your website here... 

     return true; 
    } catch (Exception e) 
     Log.e("tag", "error", e); 
     return false; 
    } 
    } 
} 
+0

L'utilizzo delle finestre di dialogo modali presenta uno svantaggio: blocca l'intera finestra. L'utente potrebbe voler continuare a interagire con l'applicazione mentre è in corso il caricamento. –

1

La RelativeLayout con la ListView si nasconde il tuo ProgressBar .Modify il layout come questo e vedere come va:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/layout1" 
     android:weightSum="1.0"> 

     <EditText 
      android:layout_width="0px" 
      android:layout_height="wrap_content" 
      android:layout_weight=".86" /> 

     <ImageButton 
      android:layout_height="match_parent" 
      android:layout_width="0px" 
      android:layout_weight=".14" /> 

    </LinearLayout> 

    <ListView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" android:layout_below="@id/layout1"/> 

    <RelativeLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:gravity="center" 
     android:layout_centerInParent="true" 
     android:id="@+id/progressbar" > 

     <ProgressBar 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      style="@android:style/Widget.ProgressBar.Small" /> 

    </RelativeLayout> 


</RelativeLayout> 

hanno anche un aspetto at one of my answers, per un problema in qualche modo simile.

1

Non è necessario nidificare il ProgressBar in un altro RelativeLayout. Basta centrarlo nel tuo layout principale e metterlo finalmente così rimane in alto.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    // the rest 

    <ProgressBar 
     android:id="@+id/progressBar" 
     android:layout_centerInParent="true" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" /> 

</RelativeLayout> 
0

Per coloro che sono interessati alla risposta.

Le etichette principali sono solo scritte.

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/layout1" 
     android:weightSum="1.0" > 

     <EditText 
      android:layout_width="0px" 
      android:layout_height="wrap_content" 
      android:layout_weight=".86" /> 

     <ImageButton 
      android:layout_height="match_parent" 
      android:layout_width="0px" 
      android:layout_weight=".14" /> 

    </LinearLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/layout1" > 

     <ListView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/layout1" /> 

    </RelativeLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/layout1" 
     android:gravity="center" 
     android:visibility="gone" 
     android:background="#DDE7E7E8" 
     android:id="@+id/pBar" > 

     <ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@android:style/Widget.ProgressBar.Small" /> 

    </LinearLayout> 

</RelativeLayout> 

E il AsyncTask:

private class Parsing extends AsyncTask<Void, Void, Void> 
{ 
    private LinearLayout pBar; 

    private Parsing() 
    { 
     pBar = (LinearLayout) findViewById(R.id.pBar); 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     parsingHere(); 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     pBar.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     super.onPostExecute(result); 
     pBar.setVisibility(View.INVISIBLE); 
    } 

} 
Problemi correlati