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