2016-07-23 31 views
0

Ich habe eine Listview mit einem Adapter angeschlossen. Ich führe Nachrichtenobjekte in den Adapter ein. Normalerweise würde ich nur notifydatasetchanged() nach jedem Hinzufügen aufrufen, aber ich möchte es optimieren, da ich manchmal 10 Nachrichten in den Adapter in 2 Sekunden gehen kann.Wie nur notifydatasetchanged() nach x Anzahl der Objekte in x-Sekunden-Sekunden aufrufen?

Ich versuchte den folgenden Code, aber nach einer Weile würde die App abstürzen.

Wenn Additionen wirklich schnell geschehen dann möchte ich nur alle vier Additionen notifydatasetchanged() aufrufen. Wenn jedoch die Zugabegeschwindigkeit langsamer ist, vielleicht 1 Addition pro 2 Sekunden, dann ist das Ausführen von notifydatasetchanged() nach jeder Addition in Ordnung.

Irgendwelche Ideen, wie ich das erreichen würde? Danke

public void addMessage(Message message) { 

     messages.add(message); 

     count++; 

     shouldwenotify(); 
    } 


    private void shouldwenotify(){ 
     if (count == 1){ 
      handler.postDelayed(runnable, 1500); 
     } 

     if (count > 2){ 
      notifyDataSetChanged(); 
      count=0; 
     } 
    } 

    private Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      if (count == 1) { 
       notifyDataSetChanged(); 
       count=0; 
      } else if (count == 2){handler.postDelayed(runnablesecond, 1000);} 
     } 
    }; 

    private Runnable runnablesecond = new Runnable() { 
     @Override 
     public void run() { 
      if (count < 3) { 
       notifyDataSetChanged(); 
       count = 0; 
      } 
     } 
    }; 
+0

Haben Sie darüber nachgedacht, mit 'RecyclerView' anstelle von' ListView'? Dann können Sie die Methoden 'notifyItemInserted()' und 'notifyItemRangeInserted()' verwenden, anstatt 'notifyDataSetChanged()' nach jedem Hinzufügen aufzurufen. – PPartisan

+0

Ich habe einen Blick darauf geworfen, ich glaube, ich habe mich entschieden, nicht damit zu gehen, weil man den Transkriptmodus nicht mit Recyclerview verwenden kann. Es gab noch einen anderen Grund, aber ich kann mich nicht erinnern, was es jetzt war. Vielleicht werde ich noch einen Blick darauf werfen. Danke –

+1

Ich habe gerade RecyclerView implementiert und es funktioniert jetzt großartig. Danke für den Tipp :) –

Antwort

0

Am Ende habe ich stattdessen RecyclerView implementiert. Es ist viel besser für Speicherverbrauch und CPU-Auslastung.

Die Art und Weise habe ich es mit Transkript-Modus wie ein Listview zu bewegen war, dies zu tun ..

 if (dragging == false) { 
      notifyItemInserted(getItemCount() + 1); 
      list.smoothScrollToPosition(messages.size() - 1); 
     } 

     list.addOnScrollListener(new RecyclerView.OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
        dragging = false; 
       } 
       if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { 
        dragging = true; 
       } 
      } 
      });