我正在从数据库中获取用户ID字符串的JSON数组:
["uid1", "uid103", "uid322"]
我在时间触发的循环上获取此数组,并且我将notifyDataSetChanged
与myDataSet.clear()
一起使用以显示列表,并防止重复。这种方法的问题在于,列表一直在“刷新”,我只想添加或删除需要删除或添加的项目。
如果我删除了clear()
部分,则列表不会刷新,但是我会得到重复的项目。
这是代码(+ pseudo)的样子:
trigger(just a time based loop) {
myDataset.clear();
jsonArray = //the id array from the database;
for (int i=0;i<jsonArray.length;i++){
myDataset.add(new User(jsonArray.get(i), imageUrl));
mAdapter.notifyDataSetChanged();
}
}
答案 0 :(得分:0)
您可以为此目的使用DiffUtil类(Medium example)。
它计算新数据集和旧数据集之间的差异并对其进行更新。
但是,如果您不想深入研究DiffUtil,可以尝试使用#modified init function
def __init__(self, layers):
super().__init__()
self.fc=nn.ModuleList()
self.sigmoid=[]
self.activationValue = []
self.layers = layers
for i in range(len(layers)-1):
self.fc.append(nn.Linear(layers[i],layers[i+1]))
self.sigmoid.append(nn.Sigmoid())
和notifyItemInserted()
的组合
答案 1 :(得分:0)
按如下所示更改代码,您的循环将执行数据中的所有更改,并且一旦循环结束,您便会立即将这些更改通知列表,而不必每次都刷新。
for (int i=0;i<jsonArray.length;i++){
myDataset.add(new User(jsonArray.get(i)));
}
mAdapter.notifyDataSetChanged();
如果要避免使用Set
进行重复,请从json数组中添加要设置的项,并将其用作列表的数据源。
答案 2 :(得分:0)
刷新之前,您需要比较2个列表。因此,
但是,如果删除一个项目并同时添加一个项目,则列表的大小将相同,但最后一个项目将更改。
因此,需要在刷新之前检查数组大小和最后一项:
trigger(just a time based loop) {
if((myDataset.size() != jsonArray.size()) || myDataset[last] != jsonArray[last]) {
myDataset.clear();
jsonArray = //the id array from the database;
for (int i=0;i<jsonArray.length;i++){
myDataset.add(new User(jsonArray.get(i)));
mAdapter.notifyDataSetChanged();
}
}
}
答案 3 :(得分:0)
您对计时器触发器有基本的误解。循环不会在那里暂停,以等待您从JSON输入下一个用户。因此,在循环中添加notify是非常糟糕的做法。一个在循环外的通知就足够了。如果添加了新用户,则它应出现在另一个计时器触发器中,即另一个循环中。
如果看到重复,则必须在处理JSON的代码中才能插入数据库。但是,此代码未在此处列出,因此您需要查看该代码。
在数据库表中添加唯一索引是一个很好的解决方案。
答案 4 :(得分:0)
为避免重复使用包含
myDataset.clear();
for (int i=0;i<jsonArray.length;i++){
User user=new User(jsonArray.get(i), imageUrl);
//now check if its already in list or not by using contains.
if(!myDataset.contains(user)){
myDataset.add(user)
}
}//end of loop
,然后将列表传递到您的适配器,然后呼叫notifyDataSetChanged()
mAdapter.notifyDataSetChanged();