RecyclerView Adapter 使对象失效
RecyclerView Adapter invalidating objects
我在 MainActivity 中对同一个 URL 调用了 4 个 Asynctasks(期望每个都得到相同的结果)
sendRequest(WALKING);
sendRequest(WALKING);
sendRequest(WALKING);
sendRequest(WALKING);
根据请求的结果,我创建了我的 Ruta 对象:
Ruta ruta = new Ruta();
ruta.distancia = new Distancia(jsonDistance.getString("text"), jsonDistance.getInt("value"));
ruta.duracion = new Duracion(jsonDuration.getString("text"), jsonDuration.getInt("value"));
ruta.endAddress = jsonLeg.getString("end_address");
ruta.startAddress = jsonLeg.getString("start_address");
ruta.startLocation = new LatLng(jsonStartLocation.getDouble("lat"), jsonStartLocation.getDouble("lng"));
ruta.endLocation = new LatLng(jsonEndLocation.getDouble("lat"), jsonEndLocation.getDouble("lng"));
ruta.points = decodePolyLine(overview_polylineJson.getString("points"));
ruta.tipo = mode;
ruta.json = data;
Log.d("objetofinal", ruta.tipo);
创建对象后,我使用在 MainActivity 上调用的方法将它们添加到我的 RecyclerView 适配器中。
listRoutesAdapter.add(ruta);
ListaRutasAdapter中add方法的实现是这样的:
//implementation
public void add(Ruta route) {
listaRutas.add(route);
this.notifyDataSetChanged();
Log.d("type_inserted", route.tipo);
}
//Resume of the adapter
public List<Ruta> listaRutas;
public ListaRutasAdapter(Context context, List<Ruta> listaRutas) {
this.listaRutas = listaRutas;
this.layoutInflater = LayoutInflater.from(context);
this.context = context;
}
public void deleteW(String modeN) {
if (listaRutas != null && !listaRutas.isEmpty()) {
Log.d("Size of the list", String.valueOf(getItemCount()));
for (int i = 0; i < listaRutas.size(); i++) {
String modo = listaRutas.get(i).tipo;
if (modo.equals(modeN)) {
listaRutas.remove(i);
this.notifyItemRemoved(i);
this.notifyItemRangeChanged(i, listaRutas.size());
}
}
}
}
在我的 MainActivity 中,我调用方法 delete 来删除所有具有特定类型的项目,在本例中 "walking"。
listaRutasAdapter.deleteW("walking");
当我调用异步任务项目时,我正确地得到了在 recyclerview 中绘制的 4 个项目:
但是当我从我的 MainActivity 中调用 removeM 方法时,它只会从我的 recyclerview 中删除 2 个。
在尝试删除所有相同类型的对象之前,我得到了列表的大小,它始终等于未删除的项目数。对于那些对象,if (modo.equals(modeN))
中的比较总是错误的。如果我记录 "modo" 的值,我什么也得不到。
注意:所有对象的类型、距离和时间值都完全相同。不是错误或错误。
更改您的代码如下
public void deleteW(String modeN) {
if (listaRutas != null && !listaRutas.isEmpty()) {
int i = 0;
while (i < listaRutas.size() ) {
String modo = listaRutas.get(i).tipo;
if (modo.equals(modeN)) {
listaRutas.remove(i);
i--;
}
i++;
}
notifyDataSetChanged();
}
}
我在 MainActivity 中对同一个 URL 调用了 4 个 Asynctasks(期望每个都得到相同的结果)
sendRequest(WALKING);
sendRequest(WALKING);
sendRequest(WALKING);
sendRequest(WALKING);
根据请求的结果,我创建了我的 Ruta 对象:
Ruta ruta = new Ruta();
ruta.distancia = new Distancia(jsonDistance.getString("text"), jsonDistance.getInt("value"));
ruta.duracion = new Duracion(jsonDuration.getString("text"), jsonDuration.getInt("value"));
ruta.endAddress = jsonLeg.getString("end_address");
ruta.startAddress = jsonLeg.getString("start_address");
ruta.startLocation = new LatLng(jsonStartLocation.getDouble("lat"), jsonStartLocation.getDouble("lng"));
ruta.endLocation = new LatLng(jsonEndLocation.getDouble("lat"), jsonEndLocation.getDouble("lng"));
ruta.points = decodePolyLine(overview_polylineJson.getString("points"));
ruta.tipo = mode;
ruta.json = data;
Log.d("objetofinal", ruta.tipo);
创建对象后,我使用在 MainActivity 上调用的方法将它们添加到我的 RecyclerView 适配器中。
listRoutesAdapter.add(ruta);
ListaRutasAdapter中add方法的实现是这样的:
//implementation
public void add(Ruta route) {
listaRutas.add(route);
this.notifyDataSetChanged();
Log.d("type_inserted", route.tipo);
}
//Resume of the adapter
public List<Ruta> listaRutas;
public ListaRutasAdapter(Context context, List<Ruta> listaRutas) {
this.listaRutas = listaRutas;
this.layoutInflater = LayoutInflater.from(context);
this.context = context;
}
public void deleteW(String modeN) {
if (listaRutas != null && !listaRutas.isEmpty()) {
Log.d("Size of the list", String.valueOf(getItemCount()));
for (int i = 0; i < listaRutas.size(); i++) {
String modo = listaRutas.get(i).tipo;
if (modo.equals(modeN)) {
listaRutas.remove(i);
this.notifyItemRemoved(i);
this.notifyItemRangeChanged(i, listaRutas.size());
}
}
}
}
在我的 MainActivity 中,我调用方法 delete 来删除所有具有特定类型的项目,在本例中 "walking"。
listaRutasAdapter.deleteW("walking");
当我调用异步任务项目时,我正确地得到了在 recyclerview 中绘制的 4 个项目:
但是当我从我的 MainActivity 中调用 removeM 方法时,它只会从我的 recyclerview 中删除 2 个。
在尝试删除所有相同类型的对象之前,我得到了列表的大小,它始终等于未删除的项目数。对于那些对象,if (modo.equals(modeN))
中的比较总是错误的。如果我记录 "modo" 的值,我什么也得不到。
注意:所有对象的类型、距离和时间值都完全相同。不是错误或错误。
更改您的代码如下
public void deleteW(String modeN) {
if (listaRutas != null && !listaRutas.isEmpty()) {
int i = 0;
while (i < listaRutas.size() ) {
String modo = listaRutas.get(i).tipo;
if (modo.equals(modeN)) {
listaRutas.remove(i);
i--;
}
i++;
}
notifyDataSetChanged();
}
}