【问题标题】:Delete Arraylist data before adding添加前删除 Arraylist 数据
【发布时间】:2019-02-14 11:29:51
【问题描述】:

我的代码

 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 个孩子
如果我更改用户的数据,则应删除 arraylist 中的数据并再次将其添加到更改的数据中

假设用户 A 的值为 X
用户B的值为Y

它在活动中显示了这种方式,如果我将用户 A 的值从 X 更改为 P
我希望活动显示新数据,即 P

但是在我尝试过的方法中。

第一个我得到 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;
}

}

【问题讨论】:

  • 您的HomeScreenChatsHelper 类是否实现了.equals.hashCode 方法? List 的 .contains 方法和 .remove 方法(以及其他方法)需要这些才能知道要删除哪个对象。
  • 不,它没有实现任何这些......@KevinCruijssen

标签: java android database firebase arraylist


【解决方案1】:

据我所知,您的第一种方法尝试删除 A = P,然后添加 A = P。

如果您管理如何将 mChats.remove(object) 中的对象更改为 A = X。它应该可以工作。

只是为了涵盖所有内容 mChats.clear();使 mChats 为空。

【讨论】:

    【解决方案2】:

    您的HomeScreenChatsHelper 很可能缺少hashCode()equals() 方法,这是List#remove(Object)(或List#contains(Object) 和类似方法)工作所必需的,因此它知道列表中的哪个HomeScreenChatsHelper与您要删除的相同。

    大多数 IDE 都可以自动生成这两种方法。在 IntelliJ IDE 中,您按 Alt + Insert(或右键单击 > 生成...)

    然后点击“equals()和hashCode()”

    或者在 Eclipse 中右键单击源中的某处并选择: “来源” > “生成 hashCode() 和 equals()...”

    无论哪种方式,它都会为您的班级产生如下内容:

    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 代码中)您正在删除和添加新数据)。

    【讨论】:

    • mChats.remove(new HomeScreenChatsHelper(name, message, lastSeenTime, from, seen));
    • 但它仍然没有被删除...我在下面添加了一个日志语句来检查大小并且它保持不变
    • @MaiseeMiller 但是new HomeScreenChatsHelper(name, message, lastSeenTime, from, seen) 不是您要添加的吗?您要删除的具有不同的name 和其他属性,不是吗?您提到您有一个值为 X 的用户 A 和一个值为 Y 的用户 B,并且您想删除值为 X 的用户 A,并添加值为 P 的用户 A。删除和添加不应该有不同的输入吗?要删除的值 X 和要添加的值 P?还是我误解了你想做什么?
    【解决方案3】:

    您可以做的是保留user_names.put(user_code, user_name) 的单独HashMap 并更新该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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多