2013-12-09 27 views
6

ben sahip 2 sınıfları,güncelleme listview

1.Activity sınıf

benim aktivitesinde benim liste görünümü güncellemeniz gerekir

2.Service sınıfı, hizmet aldığımda herhangi bir güncelleme. Aslında bir sohbet uygulaması gibi çalışıyorum, Hizmetlerim her zaman db'yi kontrol ediyor ve yeni bir dize varsa, yeniden oluşturmadan aktivitemde güncelleme yapmam gerekiyor, sadece liste görünümünü yenilemeliyim. iBinder kullanılarak manipüle edileceğini buldum, ama nasıl kullanacağımı bilmiyorum. Herhangi biri bana bazı kod örnekleri önerebilir.

referred pages

cevap

4

Bir Bound Hizmeti kullanmak gerekir. Başvurumda benzer bir şey yaptım. Yenileme üzerine tıklandığında, arka planda veri alan ve kullanıcı arayüzünü güncelleyen bir hizmeti çağırıyorum.

burada Kontrol dışarı hizmetimi: 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); 
} 

Etkinlik: 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; 
    } 
} 

Ayrıca yararlı Otto kütüphanesini kullanmak istiyoruz: Daha fazla bilgi olmadan
http://square.github.io/otto/

0

Ben kutu yararlı bir kod örneği sağlamaz, ancak aradığınız şeyin bir ListAdapter olduğunu düşünüyorum. Bir ListAdapter bir liste görünümü ve bir veri kümesi alır (sizin durumunuzda belki bir dizi dizgiler) ve 2. birleştirir Ne zaman veri kümesi değiştiğinde (sizin durumunuzda bu sizin hizmetiniz yeni bir dizi algıladığında olurdu ve diziye ekler) ListAdapter.notifyDataSetChanged() öğesini çağırın ve liste görünümü yeni bilgilerinizle otomatik olarak güncellenir. Kullanabileceğiniz belirli bir ListAdapter hakkında daha fazla bilgi için http://developer.android.com/reference/android/widget/ArrayAdapter.html'u kontrol edin.

+1

Thanx Cevabınız için ..: Eğer servis sınıf içinde listview verilerde değişiklik yaptığında,

public static Handler UIHandler; static { UIHandler = new Handler(Looper.getMainLooper()); } public static void runOnUI(Runnable runnable) { UIHandler.post(runnable); } 

ListView için yeni verileri uygulamak için bu kodu yazmak: MainActivity içinde bu kodu koy Aslında siz haklısınız.Ama Benim sorum şu ki benim etkinlikten veri setinin değiştiğini nasıl bilirim? Nasıl hizmetimden nasıl ayrılmalıyım? – GaneshKumar

+0

Bunu kişisel olarak yapmak zorunda kalmadım, bu yüzden hangi yöntemin en iyi olduğunu kesin olarak söyleyemem, ama sanırım bir [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) Senin için çalış. Bir servis tarafından yayınlanan mesajları işleyebilen soyut bir sınıftır. Hizmet, yeni bir dize bulduğunda sendBroadcast() yöntemini kullanacak ve etkinliğiniz bir yayın alındığında bazı eylemleri gerçekleştirecek bir Yayıncı Olarak kaydedilecektir. – csmckelvey

3

ListView'ınızı listviewAdapter adlı bir adaptörle başlattığınız MainActivity adlı etkinlik sınıfına sahip olduğunuzu varsayalım. ,

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

Bu, şu an için çalışıyor, ancak aşağıdaki gibi bazı konuyla ilgili istisnalar için korkuyorum: – Reda