RecyclerView仅在滚动时更新

时间:2016-07-01 08:42:31

标签: android android-recyclerview recycler-adapter

我有一个带有适配器的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() );

并且有效

4 个答案:

答案 0 :(得分:3)

尝试指定插入或移除项目的位置,而不是 notifyDataSetChanged(); 。你可以用

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

答案 1 :(得分:1)

一种可能的解决方案是使用Realm Adapter。 Thant将根据插入/更新/删除自动管理您的滚动视图位置。没有闪烁效果。缺点是您将Object作为Realm Object扩展。

答案 2 :(得分:1)

您很有可能正在从后台线程调用notifyDataSetChanged

您可以做的简单(难看)的修复方法是使用:

recyclerView.post(new Runnable(){ @Override public void run(){ adapter.notifyDataSetChanged(); } });

如果从主线程正确调用了notifyDataSetChanged,则列表会更新而不会触及它。

答案 3 :(得分:0)

由于问题已经解决,您可以再使用一行来滚动到recyclerView的最后位置:

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