我正在从适配器内部的recyclerview更新数据:
private void desmarcar_anuncio_favorito(final String anuncioF, final String usuarioF, final Integer position) {
// Tag used to cancel the request
String tag_string_req = "req_login";
StringRequest strReq = new StringRequest(Request.Method.POST,
URL_MEDIA_ANUNCIO, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
String ultimo = response;
String ya = "borrado";
if (ultimo.equals(ya)){
Toast.makeText(context,"Anuncio eliminado de favoritos",Toast.LENGTH_SHORT).show();
updateData(anuncios);
}
else {
Toast.makeText(context,"Error al eliminar anuncio de favoritos",Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("anuncio", anuncioF);
params.put("usuario", usuarioF);
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
public void updateData(List data) {
this.anuncios = data;
notifyDataSetChanged();
}
使用此代码,更新是在远程数据库中完成的,但是recyclerview项未更新,在这种情况下,应将其从recyclerview中删除。
我在做什么错了?
答案 0 :(得分:1)
updateData(anuncios);
您要使用数据anuncios
的当前值更新recyclerview,必须从清单anuncios.remove(indexOfItemRemoving)
中删除该项目,然后调用notifyDataSetChanged()
或notifyItemRemoved(indexOfItemRemoving)
< / p>
您需要做的是indexOfItemRemoving
进行更新。
您的方法updateData将您的情况下的列表替换为以前的列表,您需要更改列表并仅通知适配器。
类似的东西:
if (ultimo.equals(ya)){
Toast.makeText(context,"Anuncio eliminado de favoritos",Toast.LENGTH_SHORT).show();
int indexOfItemRemoving = anuncios.size(); // get the correct item here instead
anuncios.remove(indexOfItemRemoving);
notifyItemRemoved(indexOfItemRemoving);
}
使用notifyItemInserted / Removed / RangeChanged会有一个优势,因为RecyclerView可以通过很好的事件动画反馈来处理这些事件