Удалить данные Arraylist перед добавлением - PullRequest
0 голосов
/ 14 февраля 2019

Мой код

 private void addOnlineData(final String item) {
    mChildEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            if (dataSnapshot != null) {

                final String message = dataSnapshot.child("Message").getValue().toString();
                final String time = dataSnapshot.child("Time").getValue().toString();
                final String from = dataSnapshot.child("From").getValue().toString();
                final String seen = dataSnapshot.child("Seen").getValue().toString();

                LastSeen lastSeeen = new LastSeen();
                long lastTime = Long.parseLong(time);
                final String lastSeenTime = lastSeeen.lastSeen(lastTime, getActivity());

                mDatabaseReference.child("UserData").child(item).child("Name").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        String name = dataSnapshot.getValue().toString();

//CODE GIVEN BELOW WAS HERE

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

То, что я попробовал

1

                        Log.d("HHHHH2222", String.valueOf(mChats.size()));
  mChats.remove(new HomeScreenChatsHelper(name, message, lastSeenTime, from, seen));
                        Log.d("HHHHH2222", String.valueOf(mChats.size()));
  mChats.add(new HomeScreenChatsHelper(name, message, lastSeenTime, from, seen));
                        mAdapter.notifyDataSetChanged();

2

                        Log.d("HHHHH2222", String.valueOf(mChats.size()));
                        mChats.clear();
                        mChats.add(new HomeScreenChatsHelper(name, message, lastSeenTime, from, seen));
                        Log.d("HHHHH2222", String.valueOf(mChats.size()));
                        mAdapter.notifyDataSetChanged();

Моя деятельность просто получает данные пользователя из firebase, и в настоящее время она имеет 2 дочерних элемента
Если я изменю данные пользователя, данные в массиве данных должны быть удалены и добавлены сновак измененным данным

Предположим, что значение пользователя A равно X
значение пользователя B равно Y

Это показывает, что в действии, и если я изменю значение пользователя A наP из X
Я хочу, чтобы действие показывало новые данные, которые P

Но в методах, которые я попробовал.

1st One Imполучение 3 значений A = X, B = Y и A = P
. Как видите, новые данные добавляются, но существующие данные не удаляются

Во втором методеактивность просто обновляется только с данными ne, которые имеют вид A = P

Когда добавляются новые данные, я хочу удалить старые данные и показать новые без повторения

Методы, которые я пробовал, Код был внутри onDataChange

Класс помощника

public class HomeScreenChatsHelper {

private String Name;
private String LastMessage;
private String LastMessageTime;
private String From;
private String Seen;

public HomeScreenChatsHelper(){
}

public HomeScreenChatsHelper(String name, String lastMessage, String lastMessageTime, String from, String seen) {
    this.Name = name;
    this.LastMessage = lastMessage;
    this.LastMessageTime = lastMessageTime;
    this.From = from;
    this.Seen = seen;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getMessage() {
    return LastMessage;
}

public void setMessage(String message) {
    LastMessage = message;
}

public String getTime() {
    return LastMessageTime;
}

public void setTime(String time) {
    LastMessageTime = time;
}

public String getFrom() {
    return From;
}

public void setFrom(String from) {
    From = from;
}

public String getSeen() {
    return Seen;
}

public void setSeen(String seen) {
    Seen = seen;
}

}

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

В вашем HomeScreenChatsHelper, скорее всего, отсутствует метод hashCode() и equals(), который необходим для работы List#remove(Object) (или List#contains(Object) и аналогичных методов), поэтому он знает, какой HomeScreenChatsHelper в спискетакой же, как тот, который вы хотите удалить.

Большинство IDE имеют способ автоматически генерировать эти два метода.В IntelliJ IDE вы нажимаете Alt + Insert (или щелкните правой кнопкой мыши> Generate ...)

IntelliJ Generate Menu

Затем нажмите «equals () и hashCode ()"

Или в Eclipse щелкните правой кнопкой мыши где-нибудь на источнике и выберите:" Source ">" Generate hashCode () and equals () ... "

Eclipse Right Click Menu

В любом случае, для вашего класса будет получено что-то вроде следующего:

public class HomeScreenChatsHelper {

    private String name;
    private String lastMessage;
    private String lastMessageTime;
    private String from;
    private String seen;

    @Override
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((from == null) ? 0 : from.hashCode());
      result = prime * result + ((lastMessage == null) ? 0 : lastMessage.hashCode());
      result = prime * result + ((lastMessageTime == null) ? 0 : lastMessageTime.hashCode());
      result = prime * result + ((name == null) ? 0 : name.hashCode());
      result = prime * result + ((seen == null) ? 0 : seen.hashCode());
      return result;
    }
    @Override
    public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      HomeScreenChatsHelper other = (HomeScreenChatsHelper) obj;
      if (from == null) {
        if (other.from != null)
          return false;
      } else if (!from.equals(other.from))
        return false;
      if (lastMessage == null) {
        if (other.lastMessage != null)
          return false;
      } else if (!lastMessage.equals(other.lastMessage))
        return false;
      if (lastMessageTime == null) {
        if (other.lastMessageTime != null)
          return false;
      } else if (!lastMessageTime.equals(other.lastMessageTime))
        return false;
      if (name == null) {
        if (other.name != null)
          return false;
      } else if (!name.equals(other.name))
        return false;
      if (seen == null) {
        if (other.seen != null)
          return false;
      } else if (!seen.equals(other.seen))
        return false;
      return true;
    }

    // Getters & Setters
}

При этом ваш параметр 1 должен работать как задумано, удаливHomeScreenChatsHelper со старыми данными и добавление HomeScreenChatsHelper с новыми данными (в текущем коде варианта 1 вместо этого вы удаляете и добавляете новые данные).

0 голосов
/ 14 февраля 2019

Что вы можете сделать, это сохранить отдельную HashMap в user_names.put(user_code, user_name) и обновить имя в этой HashMap user_names.replace(user_code, user_name)

Примечание: добавляйте пользователя только тогда, когда он не существует, в противном случае обновляйте.

передать HashMap user_key в вашем утверждении

mChats.add(new HomeScreenChatsHelper(user_names.user_key, message, lastSeenTime, from, seen));

Когда вы хотите отобразить имя пользователя, выберите его из user_names HashMap.

user_names.get(user_key) 
0 голосов
/ 14 февраля 2019

Из того, что я вижу, ваш первый метод пытается удалить A = P, а затем добавить A = P.

Если вам удастся изменить свой объект в mChats.remove (object) на A = X.должно работать.

Просто чтобы охватить все mChats.clear ();делает mChats пустыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...