Java 当我手动更改firebase数据库中的值时,我会在listview中创建更多项,而不是更新listview中的值

Java 当我手动更改firebase数据库中的值时,我会在listview中创建更多项,而不是更新listview中的值,java,android,firebase,listview,firebase-realtime-database,Java,Android,Firebase,Listview,Firebase Realtime Database,我不知道我的代码出了什么问题,请帮助我。 只是尝试检索列表视图中的数据 My MainActivity.java public class MainActivity extends AppCompatActivity { ListView listView; FirebaseDatabase database; DatabaseReference ref; ArrayList<String> list; ArrayAdapter <String> adapter; Us

我不知道我的代码出了什么问题,请帮助我。 只是尝试检索列表视图中的数据

My 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) {

        }
    });
}
下面是图片

我只想更新值

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

我在firebase只有3个孩子

我只是在检索数据,数据是从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) {

        }
    });

另一种方法是使用地图,这只会更新您在数据库中更新的项目

谢谢您抽出时间,先生。将尝试它现在不工作,它只显示1个项目
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) {

        }
    });