2013-12-09 19 views
6

io avere 2 classi,aggiornamento listview nella mia attività dal servizio androide

classe 1.RAPP

classe 2.Service

ho bisogno di aggiornare il mio visualizzazione elenco nella mia attività, quando il servizio ha ottenuto nessun aggiornamento. In realtà provo come un'applicazione di chat, i miei servizi controllano sempre il mio db e se ha una nuova stringa, devo aggiornare la mia attività senza ricostruirla di nuovo solo ho bisogno di aggiornare la vista elenco. ho scoperto che verrà manipolato usando iBinder, ma non so come usarlo. Qualcuno mi può suggerire con alcuni esempi di codice.

referred pages

risposta

4

È necessario utilizzare un servizio Bound. Ho fatto qualcosa di simile nella mia domanda. Quando, dopo aver fatto clic su Aggiorna, invoco un servizio che ottiene i dati in background e aggiorna l'interfaccia utente.

controllare il mio servizio qui: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override 
protected void onPostExecute(AnalyticsAccountResult result) { 
    super.onPostExecute(result); 
    App.getEventBus().post(result); 
} 

attività: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe 
public void UpdateUI(AnalyticsAccountResult result) { 
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress); 
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout); 
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage); 

    switch (result.getStatus()) { 
     case STARTING: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.VISIBLE); 
     spinnerLayout.setVisibility(View.GONE); 
     break; 

     case FAILURE: 
     statusMessage.setVisibility(View.VISIBLE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.GONE); 
     statusMessage.setText(result.getErrorMessage()); 
     break; 

     case SUCCESS: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.VISIBLE); 

     if (result.getItems() != null) 
     { 
      this.acProfiles = result.getItems(); 
      MyAdapter myAdapter = new MyAdapter(acProfiles, this); 
      listView.setAdapter(myAdapter); 
      UpdateSelectionPreferences(); 
      if (result.isPersist() && acProfiles.size() > 0) 
      { 
       if (App.LOCAL_LOGV) 
       Log.v(App.TAG, "saving configdata");   
       try 
       { 
        appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName()); 
       } 
       catch (JsonProcessingException e) 
       { 
        Log.e(App.TAG, e.getMessage()); 
       } 
      } 
     } 
     break; 
    } 
} 

Sarebbe anche utile usare Otto libreria:
http://square.github.io/otto/

0

Senza ulteriori informazioni Ho può non fornire esempi di codice utili, tuttavia penso che quello che stai cercando sia un ListAdapter. Un ListAdapter prende una listview e un set di dati (nel tuo caso forse una serie di stringhe) e combina il 2. Ogni volta che il set di dati cambia (nel tuo caso questo sarebbe quando il tuo servizio rileva una nuova stringa e la aggiunge all'array) tu solo chiama ListAdapter.notifyDataSetChanged() e listview verrà automaticamente aggiornato con le tue nuove informazioni. Controlla http://developer.android.com/reference/android/widget/ArrayAdapter.html per ulteriori informazioni sullo specifico ListAdapter che potresti utilizzare.

+1

Grazie per la risposta, .. In realtà hai ragione. Ma la mia domanda è: come faccio a sapere che il set di dati è cambiato dalla mia attività ... Come dovrei essere intimato dal mio servizio? – GaneshKumar

+0

Non ho dovuto farlo personalmente, quindi non posso dire con certezza quale metodo sia il migliore, ma penso che un [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) Lavoro per te. È una classe astratta in grado di gestire i messaggi trasmessi da un servizio. Il servizio utilizzerà il metodo sendBroadcast() quando trova una nuova stringa e la tua attività verrà registrata come BroadcastReciever che eseguirà un'azione quando viene ricevuta una trasmissione. – csmckelvey

3

Supponiamo di avere la classe di attività denominata MainActivity in cui è stato inizializzato il ListView con l'adattatore denominato listviewAdapter. Inserire questo codice all'interno MainActivity:

public static Handler UIHandler; 

    static { 
     UIHandler = new Handler(Looper.getMainLooper()); 
    } 

    public static void runOnUI(Runnable runnable) { 
     UIHandler.post(runnable); 
    } 

quando sono state apportate modifiche ai dati ListView all'interno della vostra classe di servizio, scrivere questo codice per applicare i nuovi dati al ListView:

MainActivity.runOnUI(new Runnable() 
{ 
    public void run() 
    { 
     try 
     { 
      MainActivity.listviewAdapter.notifyDataSetChanged(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

Questo è bello, funziona per ora, ma temo per alcune eccezioni relative ai thread dopo: / – Reda