Предотвратить обновление всего RecyclerView, добавить только новый элемент - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть вложенные прослушиватели для извлечения данных: сначала я извлекаю данные из базы данных, а затем получаю список пользователей, у которых есть эти данные, и сохраняю список существующих пользователей в ArrayList, который будетнабор данных для RecyclerView.Затем мне нужно получить некоторую информацию об этих пользователях из базы данных пользователей (их идентификаторы изображений), поэтому я делаю еще один вызов в базу данных пользователей из первого вызова 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 голосов
/ 23 декабря 2018

Вам необходимо переопределить метод 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;
        }
    }

и использовал:

mAdapter.notifyItemInserted(myDataset.size() - 1);
0 голосов
/ 23 декабря 2018

попробуйте

mAdapter.notifyItemInserted(position);

или попробуйте ниже, он сообщит о последней добавленной позиции

mAdapter.notifyItemInserted((myDataset.size())-1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...