Как удалить запись из arraylist синхронно с базой данных firebase?

У меня есть база данных:

enter image description here

У меня есть ArrayList usersList с классом UsersOnlineClass:

public class UsersOnlineClass {

    private String muserName;

    public UsersOnlineClass(String userName) {
        muserName = userName;
    }
    public String getmuserName() {
        return muserName;
    }
}

У меня есть код для добавления пользователей в usersList, когда они в сети:

onlineViewersCountRef.addChildEventListener(new ChildEventListener() {
    ArrayList<UsersOnlineClass> usersList = new ArrayList<>();
    UsersOnlineAdapter usersAdapter = new UsersOnlineAdapter(Chat.this, usersList);
    ListView lv = findViewById(R.id.usersList);
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        usersList.add(new UsersOnlineClass(dataSnapshot.getValue().toString()));
        lv.setAdapter(usersAdapter);
        Toast.makeText(Chat.this, String.valueOf(usersList.size()), Toast.LENGTH_SHORT).show();
    }

Работает нормально.

Но я не знаю, как удалить пользователя из usersList, когда он отключен. Я пробовал этот код:

        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            String deletedUser = dataSnapshot.getValue().toString();
            int i;
            for (i = 0; i < usersList.size(); i++) {
                if (usersList.get(i).equals(deletedUser)) {
                    usersList.remove(i);
                }
            }

Но не получается, позиция с usersList не удаляется. Строка deletedUser равна одной из позиций в usersList (например, Micle), это нормально, но позиция не удалена.

Помогите, пожалуйста. Как удалить запись из ArrayList синхронно с базой данных Firebase?

Вы хотите удалить пользователя также из базы данных или только из ArrayList?

Yupi 31.10.2018 13:25

От удаления записи firebase, когда пользователь выходит в автономный режим, он работает. Мне нужно удалить ту же запись из Arraylist.

Артем Ильинский 31.10.2018 13:34

С adapter.notifyDataSetChanged() пробовали после удаления? Также поместите breakpoint на usersList.remove(i), проверьте, попадет ли компилятор в breakpoint

Yupi 31.10.2018 13:43

Да, я пробую. С отладкой я вижу, что эта позиция не удалена.

Артем Ильинский 31.10.2018 13:44
2
4
567
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что проблема частично заключается в следующем: usersList.get(i).equals(deletedUser) - возвращает объект, который вы хотите сравнить с String, поэтому блок кода внутри оператора if никогда не выполняется из-за сбоя equals. Итак, вам нужно сравнить два (настраиваемых) объекта одного и того же type, или вы можете сравнить String с String, например:

public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
        UsersOnlineClass deletedUser = dataSnapshot.getValue(UsersOnlineClass.class);
        for (int i = 0; i < usersList.size(); i++) {
            if (usersList.get(i).getmuserName().equals(deletedUser.getmuserName())) {
                usersList.remove(i);
            }
        }

О, спасибо, работает. Я сделал то же самое, что и вы, за пару секунд до вашего ответа :)

Артем Ильинский 31.10.2018 13:48

Другие вопросы по теме