RecyclerView中的更新项目

时间:2019-02-23 03:50:45

标签: java android android-recyclerview recycler-adapter

我有一个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

我在适配器中所做的所有事情,因为我总是在最后添加按钮作为最后一项。运行时不起作用,我的应用程序冻结。 我该怎么解决?

非常感谢您的时间和协助。

1 个答案:

答案 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();