Android “使用缓存策略”;缓存“然后”网络;在Listview中添加重复的行

Android “使用缓存策略”;缓存“然后”网络;在Listview中添加重复的行,android,parse-platform,Android,Parse Platform,我正在使用parse查询来获取一些数据并在列表视图中显示它。我正在使用cache policyParseQuery.CachePolicy.cache\u THEN\u NETWORK,它首先从缓存中获取数据,然后在列表视图中显示数据,然后从网络中获取数据,并在列表视图中显示更新后的数据 问题是,当从网络中提取数据时(从缓存中提取后),重复的行会添加到我的listView中。我不能简单地清除适配器中的列表,因为我正在listView中使用分页 我的问题是,当从缓存或网络获取数据时,是否会触发回调

我正在使用parse查询来获取一些数据并在列表视图中显示它。我正在使用cache policy
ParseQuery.CachePolicy.cache\u THEN\u NETWORK
,它首先从缓存中获取数据,然后在列表视图中显示数据,然后从网络中获取数据,并在列表视图中显示更新后的数据

问题是,当从网络中提取数据时(从缓存中提取后),重复的行会添加到我的listView中。我不能简单地清除适配器中的列表,因为我正在listView中使用分页


我的问题是,当从缓存或网络获取数据时,是否会触发回调?或者是否有其他方法可以解决所描述的问题?

当您向列表中添加项目时,请删除已经存在的项目

public void addItem(YourItem item){
    for(YourItem item2 : yourItemsList){
       if(item.getObjectId().equals(item2.getObjectId()){
           yourItemsList.remove(item2);
           break;
       }
    }
    yourItemsList.add(item);
    yourAdapter.notifyDataSetChanged();
}
更好的是,如果您正在子类化
ParseObject
,则可以在类中重写
equals()

@ParseClassName("YourItem")
public class YourItem extends ParseObject {
      /* All your accessors */

      @Override
      public boolean equals(Object o) {
          return o != null 
                   && o instanceof YourItem 
                   && ((YourItem) o).getObjectId().equals(getObjectId());
      }
}
然后,您可以将
addItem
方法更改为:

public void addItem(YourItem item){
      yourItems.remove(item); //this will remove the object with matching ID if it exits.
      yourItems.add(item);
      yourAdapter.notifyDataSetChanged();
}

感谢您提供的解决方案,实际上我正在寻找一种更聪明、更高效的方法,这种将“yourItemList”中的每个项目与“itemList”中的每个“项目”进行比较的蛮力方法肯定会在列表庞大的情况下影响性能(在我的情况下可能超过1000个)。最终,它将始终归结为比较每个项目。我可以让它更有效,因为重复的项目将始终位于列表的末尾,所以我开始从项目列表的末尾而不是开始检查重复项,这解决了性能问题。老实说,您应该在收到网络数据时清除缓存数据。这将是最好的表现,更准确。如果网络列表删除了一个项目,搜索重复项不会删除这些项目。很好的建议是,文档说明sdk自己处理缓存清除。不确定它是否能解决您遇到的问题,但这是一个很好的问题。谢谢