RecyclerView仅在滚动时更新

14

我有一个带有适配器的 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个回答

5

很可能你正在后台线程调用notifyDataSetChanged

一个简单(但不太好看)的解决方法是使用:

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

如果正确地从主线程调用notifyDataSetChanged,则列表将在不操作它的情况下更新。

非常好的观察和精细的观察。 - Rishabh Dhiman

3
尝试指定插入或删除的项目位置而不是使用notifyDataSetChanged();。您可以使用以下方法:
notifyItemInserted(int pos);
notifyItemRangeChanged(int start, int end);`

0

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


-1

由于问题已经得到解答,您可以使用以下代码将recyclerView滚动到最后一行:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接