我知道已经问过这个问题了,所以我关注了this Question。
我的Firebase结构。
我需要在listview中显示expensesName。 如果重复数据不止一次,则该数据应仅在列表视图中显示一次,那么该数据将不会重复,如果在Firebase中没有重复数据,则该数据也应在列表视图中可见。
我已经尝试过下面的代码来删除重复的数据,但不适用于在Firebase中不重复的数据。
例如在我的火力基地中
oil // repeated 2 times
petrol //repeated 1 time
我需要输出
oil
petrol
但是实际输出是
oil
MainActivity
listfirebaseref=FirebaseDatabase.getInstance().getReference("Expenses Details").child(username).child(monthYr);
listfirebaseref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
expenseClassList.clear();
int sum = 0;
ExpenseClass expenseClass;
Log.d("Tag", "on list Adpter");
for (DataSnapshot ds : dataSnapshot.getChildren()) {
for (DataSnapshot data : ds.getChildren()) {
String exp = data.child("expensesName").getValue(String.class);
spacecraft = new ExpensesName(exp);
expenseClassList.add(spacecraft);
Log.d("Tag", " " + expenseClassList);
}
}
for (int i = 0; i < expenseClassList.size(); i++) {
for (int j = 0; j < expenseClassList.size(); j++) {
if ((expenseClassList.get(i).equals(expenseClassList.get(j)))) {
expenseClassList.remove(j);
//j;
}
}
}
Log.d("Tag", " list Adpter");
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
答案 0 :(得分:0)
为什么不使用HashSet代替ArrayList?
奇怪的是,您没有得到concurrent modification exception
。迭代时无法将其从列表中删除。 Link
Set<ExpensesName> expenseClassList = new HashSet<>();
....
for (DataSnapshot ds : dataSnapshot.getChildren()) {
for (DataSnapshot data : ds.getChildren()) {
String exp = data.child("expensesName").getValue(String.class);
spacecraft = new ExpensesName(exp);
expenseClassList.add(spacecraft);
}
}
您的expenseClassList
仅包含唯一的字符串
答案 1 :(得分:-1)
使用HashSet代替ArrayList
HashSet<String> expenseClassList = new HashSet<>();
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
expenseClassList.clear();
int sum = 0;
ExpenseClass expenseClass;
Log.d("Tag", "on list Adpter");
for (DataSnapshot ds : dataSnapshot.getChildren()) {
for (DataSnapshot data : ds.getChildren()) {
if(!expenseClassList.contains(data.child("expensesName").getValue(String.class)){
expenseClassList.add(spacecraft);
}
}
Log.d("Tag", " list Adpter");
adapter.notifyDataSetChanged();
}