如何从firebase数据库获取数据而不重复

41ik7eoe  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(302)

我正在开发一个与firebase数据库一起工作的android应用程序,当用户将项目添加到数据库时,应用程序会实时显示它,这就是我想要的,但问题是同一个项目在recyclerview中显示了不止一次这是我尝试的代码

data = new ArrayList<>();

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("workers");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if (snapshot.exists()) {
                e_iv.setVisibility(View.GONE);
                e_tv.setVisibility(View.GONE);
                rv_all.setVisibility(View.VISIBLE);
                for (DataSnapshot ds : snapshot.getChildren()) {
                    for (DataSnapshot d : ds.getChildren()) {
                        data.add(d.getValue(work.class));
                    }

                }
                mAdapter = new aAdapter(data);

                rv_all.setAdapter(allGamesAdapter);
                mAdapter.notifyDataSetChanged();
            }

但它并不能解决这个问题,当我从应用程序中出来并再次输入它时,它的工作原理是完美的,并显示项目而不重复任何人,我如何解决这个问题?

gywdnpxw

gywdnpxw1#

所发生的事情是,每当监听器返回数据时,arraylist就会得到添加的数据。要消除重复性,只需清除ondatachang()函数中的arrayList

data = new ArrayList<>();

DatabaseReference myRef = 
FirebaseDatabase.getInstance().getReference().child("workers");
myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if (snapshot.exists()) {

            data.clear();

            e_iv.setVisibility(View.GONE);
            e_tv.setVisibility(View.GONE);
            rv_all.setVisibility(View.VISIBLE);
            for (DataSnapshot ds : snapshot.getChildren()) {
                for (DataSnapshot d : ds.getChildren()) {
                    data.add(d.getValue(work.class));
                }

            }
            mAdapter = new aAdapter(data);

            rv_all.setAdapter(allGamesAdapter);
            mAdapter.notifyDataSetChanged();
        }

希望你的错误得到解决。

相关问题