【问题标题】:Remove object from list on child removed android从子列表中删除对象已删除的android
【发布时间】:2019-08-10 00:01:53
【问题描述】:

我有一个类对象的arrayList。 此类包含从 Firebase 接收的数据。

但是我想在 firebase 中删除一个子对象时从列表中删除一个对象,但是两个对象不匹配,因为快照创建了一个包含相同数据的类的新对象。这是我实现的代码:

posts = new ArrayList<>();

        childEventListener= new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                posts.add(dataSnapshot.getValue(GalleryPostModel.class));
                unapprovedAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                posts.remove(dataSnapshot.getValue(GalleryPostModel.class));
                unapprovedAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };

        UnApprovedDbRef.addChildEventListener(childEventListener);

那么我该如何解决这个问题呢?我该怎么做才能将其从列表中删除。我可以在列表中进行线性搜索,但是当列表变得很大时,这项任务将变得非常耗时。 (不能使用 .removeIf,因为它需要最低 api 级别 24,但我的应用程序的最低 api 是 22)

【问题讨论】:

    标签: android firebase arraylist firebase-realtime-database


    【解决方案1】:

    为了能够移除项目,除了保留值之外,您还必须保留其键。

    所以你为键创建了一个附加列表:

    keys = new ArrayList<String>();
    

    然后在onChildAdded中,将快照的key添加到这个列表中:

    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        posts.add(dataSnapshot.getValue(GalleryPostModel.class));
        keys.add(dataSnapshot.getKey());
        unapprovedAdapter.notifyDataSetChanged();
    }
    

    现在可以在onChildRemoved中查找key,比查找post/value快很多:

    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
        int index = keys.indexOf(dataSnapshot.getKey());
        posts.remove(index);
        keys.remove(index);
        unapprovedAdapter.notifyDataSetChanged();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 2020-04-17
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      相关资源
      最近更新 更多