【问题标题】:Items still showing in recyclerView after being deleting删除后仍显示在 recyclerView 中的项目
【发布时间】:2018-12-06 08:33:28
【问题描述】:

我有一个 recyclerview,它显示了我的 sqlite 数据库中的数据。用户可以选择删除单个项目或删除所有项目,这意味着从 sqlite db 中删除项目并从 recyclerview 中删除项目。删除单个项目效果很好。

clear all 效果不好。这些项目已从表格中删除,但 recyclerview 仍然显示这些项目,我什至仍然可以点击它们。当我重新启动活动时,recyclerview 是空的。

public void updateDataSet(){
        db = new DBHandler(context);
        db.deleteUserBasket(username);
        ItemList = db.getAllItems(userName);
        notifyDataSetChanged();
    }

这是我要求清除所有内容的原始方法,它确实有效,但现在它没有从 recyclerView 中删除项目。

我也试过了

public void deleteDataSet(){
        db = new DBHandler(context);
        ItemList = db.getAllUserCartItems(userName);
        int size = cartItemList.size();
        db.deleteUserBasket(userName);
        notifyItemRangeRemoved(0,size);
    }

这两个方法都被调用了,我已经通过了它们,但是通知方法似乎没有做任何事情。

db.deleteUserBasket(userName);

cartItemList = db.getAllUserCartItems(userName);
basketOrderAdapter = new BasketOrderAdapter(getApplicationContext(),cartItemList,userName);
basketOrderAdapter.notifyDataSetChanged();

这是我试过的别的东西,此时cartItemList是空的,调试说size = 0;

这也是一样,物品还在我的视野中

【问题讨论】:

  • ItemList = db.getAllItems(userName);在通知数据更改之前,您应该使用新列表更新您的适配器。
  • @DeividasStrioga 检查我的编辑,我添加了另一个失败的尝试
  • 如果你想以这种方式重新创建适配器,那么在 basketOrderAdapter = new BasketOrderAdapter(getApplicationContext(),cartItemList,userName); 之后将此适配器设置为recyclerview。另一方面,我会在适配器本身上为新数据添加一个设置器。这样您就不必重新创建适配器。
  • 重新创建适配器不是我的最终目标。这只是我尝试过但没有奏效的东西。我会尝试一个二传手,看看它是否有帮助,谢谢。为 RV 设置新适配器时,旧适配器会怎样?
  • 如果不行,请分享适配器代码。

标签: android android-recyclerview


【解决方案1】:

一种方法是使用刷新的数据创建新适配器并将其设置到您的 RecyclerView。然后需要 notifyDataSetChanged()。

更好的方法是在您的适配器中添加一个 setter 方法,您可以在其中设置一个新列表。之后你应该调用 notifyDataSetChanged()

【讨论】:

  • 在离开 PC 一段时间后仔细考虑一下,让 setter 正常工作。非常感谢您的回答。你不仅帮我解决了问题,还教会了我一些新东西。
【解决方案2】:

您似乎没有从 RecyclerView 的适配器列表中删除项目。

 ItemList cartItemList= db.getAllUserCartItems(userName);

从数据库返回一个新的更新列表,但它不是您用于适配器的列表。

创建一个方法来设置适配器内部的数据。当您希望更新列表时,不要创建新的适配器。

public void setAdapterList(List<Object> newData) {
    this.data = data;
    // or clear and add new data your adapter data
    this.data.clear();
    this.data.addAll(newData);
    // You can also check out DiffUtil library to only change necessary part of your adapter
    // Change adapter as you like with notify methods
    notifyDataSetChanged();
} 

【讨论】:

  • 检查我的编辑,我添加了另一个失败的尝试
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多