Android “使用缓存策略”;缓存“然后”网络;在Listview中添加重复的行
我正在使用parse查询来获取一些数据并在列表视图中显示它。我正在使用cache policyAndroid “使用缓存策略”;缓存“然后”网络;在Listview中添加重复的行,android,parse-platform,Android,Parse Platform,我正在使用parse查询来获取一些数据并在列表视图中显示它。我正在使用cache policyParseQuery.CachePolicy.cache\u THEN\u NETWORK,它首先从缓存中获取数据,然后在列表视图中显示数据,然后从网络中获取数据,并在列表视图中显示更新后的数据 问题是,当从网络中提取数据时(从缓存中提取后),重复的行会添加到我的listView中。我不能简单地清除适配器中的列表,因为我正在listView中使用分页 我的问题是,当从缓存或网络获取数据时,是否会触发回调
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自己处理缓存清除。不确定它是否能解决您遇到的问题,但这是一个很好的问题。谢谢