我有一个api,每页返回我的物品,在这种情况下,如果收到的物品等于12,则我总是要求它向我发送12物品,如果页面不保存,则会增加该页面。我有以下示例,我的api发送了第1页,但在这种情况下,它返回了4个项目,这些项目显示在RecyclerView中,按我的按钮获取更多数据后,我返回了6个项目,即4个anterios和2个以上。我想做的是将api返回的数据与RecyclerView的数据进行比较,然后仅向其中添加不同的项目。示例:
first call data -> A B C D are added to the RecyclerView
second call data -> A B C D E F
compare data from call 1 with call 2 and add E F because they are different
the final result to be shown in the RecyclerView would be the following A B C D E F
这是我的代码:
mData.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mData.size());
notifyDataSetChanged();
//this lines deletes the final button, and after add the new data
JSONArray res = response_json.getJSONArray("res");
for(int i=0;i<mData.size();i++){
if(i >= row_index){ //row_index I identify the index of the page to update from it
for(int j=0;j<res.length();j++){
JSONObject item = res.getJSONObject(j);
if(mData.get(i).getId() != item.getInt("id")){
//add diferent data
obj = new Obj();
obj.setId_pedido(item.getInt("id"));
obj.setValor(item.getString("valor"));
mData.add(obj);
notifyDataSetChanged();
}
}
}
}
Obj mas = new Obj();
mas.setId_pedido(0);
mas.setValor("OBtener mas data");
mData.add(mas);
//Add the final button
我在适配器中所做的所有事情,因为我总是在最后添加按钮作为最后一项。运行时不起作用,我的应用程序冻结。 我该怎么解决?
非常感谢您的时间和协助。
答案 0 :(得分:0)
问题是因为您总是在不需要时刷新RecyclerView适配器。
此代码不好:
mData.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, mData.size());
notifyDataSetChanged();
因为您要告诉适配器刷新3次。每当您删除项目时,只需调用以下代码:
mData.remove(position);
notifyItemRemoved(position);
您还告诉适配器在添加项目时更新所有项目:
JSONArray res = response_json.getJSONArray("res");
for(int i=0;i<mData.size();i++){
...
for(int j=0;j<res.length();j++){
JSONObject item = res.getJSONObject(j);
if(mData.get(i).getId() != item.getInt("id")){
//add diferent data
...
mData.add(obj);
notifyDataSetChanged();
}
}
...
}
,这仅表示您要告诉适配器刷新所有项目x
次。其中x
是您的新项目总数。这将冻结您的UI一段时间。
因此,仅在完成添加项后才需要更新适配器。像这样:
JSONArray res = response_json.getJSONArray("res");
for(int i=0;i<mData.size();i++){
...
for(int j=0;j<res.length();j++){
...
if(mData.get(i).getId() != item.getInt("id")){
...
mData.add(obj);
}
}
...
}
notifyDataSetChanged();