2016-07-23 3 views
0

У меня есть список с прикрепленным к нему адаптером. Я передаю объекты сообщений в адаптер. Обычно я просто вызываю notifydatasetchanged() после каждого добавления, однако я хочу оптимизировать его, поскольку иногда я могу получить 10 сообщений, поступающих в адаптер за 2 секунды.Как только вызвать notifydatasetchanged() после x количество объектов в x число секунд?

Я пробовал следующий код, но через некоторое время приложение будет разбиваться.

Если добавления происходят очень быстро, я бы хотел только вызвать notifydatasetchanged() каждые 4 дополнения. Однако, если скорость добавления медленнее, может быть 1 добавление за 2 секунды, а затем делать notifydatasetchanged() после каждого добавления в порядке.

Любые идеи о том, как я мог бы это сделать? Спасибо

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

Рассматривали ли вы с помощью 'RecyclerView' вместо' ListView'? Затем вы можете использовать 'notifyItemInserted()' и 'notifyItemRangeInserted()' методы вместо того, чтобы вызывать 'notifyDataSetChanged()' после каждого добавления. – PPartisan

+0

Я действительно изучал это, я думаю, что решил не идти с ним, потому что вы не можете использовать режим транскрипции с recyclerview. Была и другая причина, но я не могу вспомнить, что это было сейчас. Возможно, я еще раз посмотрю. Спасибо –

+1

Я только что реализовал RecyclerView, и теперь он отлично работает. Спасибо за совет :) –

ответ

0

В итоге я внедрил RecyclerView вместо этого. Это намного лучше для потребления памяти и использования ЦП.

Так я получил его прокручивать, как ListView с режимом транскрипт должен был сделать это ..

 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; 
       } 
      } 
      });