gpt4 book ai didi

java - 当我手动更改 firebase 数据库中的值时,我在 ListView 中创建更多项目,而不是更新 ListView 中的值

转载 作者:行者123 更新时间:2023-12-01 17:59:59 26 4
gpt4 key购买 nike

我不知道我的代码出了什么问题,请帮助我。只是尝试检索数据以 ListView 。

我的MainActivity.java

public class MainActivity extends AppCompatActivity {

ListView listView;
FirebaseDatabase database;
DatabaseReference ref;
ArrayList<String> list;
ArrayAdapter <String> adapter;
User user;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

user = new User();

listView = findViewById(R.id.listView);

database = FirebaseDatabase.getInstance();
ref = database.getReference("match1contest1");
list = new ArrayList<>();
adapter = new ArrayAdapter<String>(this,R.layout.user_info,R.id.userInfo, list);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()){

user = ds.getValue(User.class);
list.add(user.getName().toString()+user.getEmail().toString());

}
listView.setAdapter(adapter);

}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
}

}

我的用户.java

public class User {

private String name;
private String email;
private String phone;
private String userName;
private String password;

public User() {
}

public User(String name, String email, String phone, String userName, String password) {
this.name = name;
this.email = email;
this.phone = phone;
this.userName = userName;
this.password = password;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

下面是图片

This is The Output Of My App

When I Change Value in FireBase Database Manually It Creates 3 More Items Like in The Image

我只想更新值

我不知道为什么它会创建更多项目

我在 firebase 中只有 3 个 child

我只是检索数据,数据是从 firebase 控制台手动保存的

请帮助我...

最佳答案

当您更新数据库中的值时,它将触发您的

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {...

再次,这将获取所有子项(包括更新的子项),并将再次放置在列表中,这将重复这些项目,因为在您的 onDataChange 中,您有一个将循环的 for 循环再次遍历所有子项并将它们再次添加到当前填充的列表中。

你需要做的是,当再次获取时清除列表

ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
list.clear();
for (DataSnapshot ds: dataSnapshot.getChildren()){

user = ds.getValue(User.class);
list.add(user.getName().toString()+user.getEmail().toString());

}
listView.setAdapter(adapter);

}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});

另一种方法是使用 updateChildren()使用 map ,这只会更新您在数据库中更新的项目

关于java - 当我手动更改 firebase 数据库中的值时,我在 ListView 中创建更多项目,而不是更新 ListView 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60654708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com