【问题标题】:RecyclerView Adapter invalidating objectsRecyclerView 适配器使对象无效
【发布时间】:2016-07-03 06:07:55
【问题描述】:

我在 MainActivity 中调用 4 个 Asynctasks 到同一个 URL(期望得到每个相同的结果)

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 以删除具有某种类型的所有项目,在本例中为“行走”。

listaRutasAdapter.deleteW("walking");

当我调用异步任务项目时,我正确地得到了 recyclerview 中绘制的 4 个项目:

但是当我从 MainActivity 调用 removeM 方法时,它只会从我的 recyclerview 中删除 2。

在我尝试删除所有相同类型的对象之前,我得到了列表的大小,它始终等于未删除的项目数。对于这些对象,if (modo.equals(modeN)) 中的比较总是错误的。如果我记录“modo”的值,我什么也得不到。

注意:所有对象的类型、距离和时间值都完全相同。不是错误或错误。

【问题讨论】:

    标签: android android-asynctask android-recyclerview android-adapter android-viewholder


    【解决方案1】:

    如下修改代码

    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();
                    }
                }
    

    【讨论】:

    • 成功了!但我仍然不明白逻辑,你能解释一下解决方案吗?谢谢!!!
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2016-04-08
    • 1970-01-01
    • 2023-04-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多