如何防止重复项,但又防止整个列表刷新?

时间:2019-01-11 09:40:51

标签: android

我正在从数据库中获取用户ID字符串的JSON数组:

["uid1", "uid103", "uid322"]

我在时间触发的循环上获取此数组,并且我将notifyDataSetChangedmyDataSet.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();
    }
}

5 个答案:

答案 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();