阻止整个RecyclerView刷新,仅添加新项

时间:2018-12-23 09:41:24

标签: android firebase firebase-realtime-database android-recyclerview

我具有用于侦听数据的嵌套侦听器:首先,我从数据数据库中检索数据,然后,获得具有此数据的用户列表,并将当前用户列表保存在ArrayList内,这将是RecyclerView的数据集。然后,我需要从用户数据库中获取有关这些用户的一些信息(它们的图像ID),因此我要从第一个onDataChange调用中再次调用用户数据库(由于它是异步的,因此需要嵌套它们)。但是,当我用新项更新ArrayList时,或者每次数据库发生更改时,RecyclerView都会出现“刷新”。这是代码:

**我认为原因是这样的事实,即每次调用onDataChange时我都会调用新适配器。那么如何检查适配器是否先前已设置以及适配器是否已设置,然后不再进行设置?

DatabaseReference rootReference = FirebaseDatabase.getInstance().getReference();
DatabaseReference dataReference = rootReference.child("data");
ValueEventListener dataListener= new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

            final ArrayList<String> foundUsers = new ArrayList<>();

            for (DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                String userId= dSnapshot.getKey();
                for(DataSnapshot ds : dSnapshot.getChildren()) {    
                    if (userIsFound()){
                        foundUsers.add(userId);
                    }
                }
            }

            mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
            mRecyclerView.setHasFixedSize(true);

            // use a linear layout manager
            mLayoutManager = new LinearLayoutManager(getActivity());
            mRecyclerView.setLayoutManager(mLayoutManager);
            myDataset = new ArrayList<User>();
            mAdapter = new MyAdapter(myDataset);                
            mRecyclerView.setAdapter(mAdapter);


            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference imageIdRef= rootRef.child("users");
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.getChildren()) {
                        String currentUserId = ds.getKey();
                        if (foundUsers.contains(currentUserId )) {
                            if (ds.child("imageUrl").getValue() != null) {
                                String imageUrl = ds.child("imageUrl").getValue().toString();
                                myDataset.add(new User(currentUserId, imageUrl));
                            }
                        }
                        mAdapter.notifyDataSetChanged();                           

                    }
                    foundUsers.clear();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            imageIdRef.addValueEventListener(eventListener);

        }


        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };

    dataReference.addValueEventListener(dataListener);

2 个答案:

答案 0 :(得分:1)

您需要在Create Account button类中覆盖equals方法,以便User可以正常工作:

contains

并使用:

@Override
    public boolean equals(@Nullable Object obj) {
        if( obj instanceof User){
            User = (User) obj;
            return this.getCurrentUserId().equals(obj.getCurrentUserId());
        }else{
            return false;
        }
    }

答案 1 :(得分:0)

尝试

mAdapter.notifyItemInserted(position);

或尝试以下操作,它将通知上次添加的位置

mAdapter.notifyItemInserted((myDataset.size())-1);