RecyclerView обновляется только при прокрутке

у меня есть макет с RecyclerView с адаптером:

public class SimpleRecyclerAdapter extends RecyclerView.Adapter<SimpleViewHolder> {

  protected List<JSONObject> data = new ArrayList<>();

  public List<JSONObject> getData() { return data; }
}     

Я обновляю это адаптер, как:

public void udpdateFromJson( JSONObject payload ) {
  JSONArray msgs = payload.optJSONArray( "messages" );
  for( int ix = 0; null != msgs && ix < msgs.length(); ix++ ){
    JSONObject o = msgs.optJSONObject( ix );
    if( loadingMore ) adapter.getData().add( 1 + ix, o );
    else adapter.getData().add( o );
  }

  adapter.notifyDataSetChanged();
  recyclerView.invalidate();
}

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

что я упустил?

обновление:

чтобы исправить проблему, Я заменил строки

adapter.notifyDataSetChanged();
recyclerView.invalidate();

С

adapter.notifyItemRangeInserted( loadingMore ? 1 : 0, msgs.length() );

и он работал

3 ответов


попробуйте указать позицию вставленного или удаленного элемента вместо notifyDataSetChanged();. вы можете использовать

notifyItemInserted(int pos);
notifyItemRangeChanged(int start, int end);`

одним из возможных решений является использование Realm Adapter. Thant будет управлять положением прокрутки на основе вставки / обновления / удаления автоматически. Нет никаких мерцающих эффектов. Недостатком является то, что у вас есть объект extend как объект Realm.


поскольку на вопрос уже дан ответ, вы можете использовать еще одну строку для прокрутки до последней позиции вашего recyclerView, используя:

recyclerView.smoothScrollToPosition(msgs.length()-1)