【问题标题】:Removing ValueEventListener from each RecyclerView object从每个 RecyclerView 对象中移除 ValueEventListener
【发布时间】:2017-06-10 18:47:36
【问题描述】:

我有一个由一些 CardView 填充的 RecyclerView,其中包含一个图片、一些 TextView 和一个按钮(用作“喜欢”按钮)。我正在使用 Transaction 更新一些简单的计数器,但在喜欢/不喜欢之前,我必须检查 UserId 是否存在于我的数据库的节点中,例如:

 Post_reference :
                 ----userId_1_String: someValue
                 ----userId_2_String: someValue
                 ----userId_3_String: someValue

如果 userId 存在,我想删除它,然后用事务更新计数器(在不同的节点),否则我想添加它,然后更新计数器。 主要问题是我基本上只需要检查一次,然后我想删除监听器以避免内存泄漏,但我找不到让它工作的方法。我一直在使用 AddValueListenerForSingleValueEvent 但它更糟糕,因为你不能分离它

【问题讨论】:

  • 您可以使用我在下面发布的截断方法来实现此目的。此外,您应该使用称为toogleLike() 或类似方法的方法实现一个接口,并将侦听器从您的Activity 传递给您的RecyclerView。这样做您可以在每个 RecyclerView 项目中设置一个 onClickListener 及其当前位置。
  • 这不是我问的,我也看不到在 sn-p 中删除了侦听器的位置。您的帖子基本上只是在参考中添加和删除一些值,我正在寻找的是检查是否存在类似的内容,然后进行交易,然后立即删除侦听器。此侦听器将附加在 recyclerView 中的每个元素上,如果用户喜欢(例如),100 个不同的帖子我需要删除 100 个不同的侦听器,我正在寻找一种方法来在 Like 方法完成后执行此操作是避免内存泄漏的工作
  • 为什么要附加 100 个不同的侦听器?只需使用onChildEventListener,它将通过单个侦听器通知您databaseReference 中每个新的、更改的、删除的或移动的子项:programcreek.com/java-api-examples/…

标签: android firebase firebase-realtime-database listener


【解决方案1】:

解决了这个问题,这很容易,但将来可能会对某人有所帮助。 假设您有一个名为 ref 的数据库引用:

yourButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final ValueEventListener yourValueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    //your code on datasnapshot
                    ref.removeEventListener(this);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            };
            ref.addValueEventListener(yourValueEventListener);
        }
    });

这基本上是在节点上读取/写入并立即分离侦听器

【讨论】:

    【解决方案2】:

    要实现这一点,您应该在您不喜欢它时从您的 Post_reference 中删除该值。

    情况是,如果我喜欢你的帖子,我应该将你的postID 引用到我的userID,如果我不喜欢你的帖子,我应该什么都没有。因此,您可以随时通过dataSnapshop.exists() 查看您的交易。

    @Override
    public void onPostLike(final String postKey) {
        final String userKey = FirebaseUtil.getCurrentUserId();
        final DatabaseReference postLikesRef = FirebaseUtil.getLikesRef();
        postLikesRef.child(postKey).child(userKey).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    // User already liked this post, so we toggle like off.
                    postLikesRef.child(postKey).child(userKey).removeValue();
                } else {
                    postLikesRef.child(postKey).child(userKey).setValue(ServerValue.TIMESTAMP);
                }
            }
    
            @Override
            public void onCancelled(DatabaseError firebaseError) {
    
            }
        });
    }
    

    对于您在 Friendlypix Firebase 示例中描述的同一案例,您可以找到一个功能齐全的示例,该示例模拟了一种社交媒体,您可以在其中关注人们并查看他们的帖子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      相关资源
      最近更新 更多