在 FirebaseRecyclerAdapter 上应用过滤器

Posted

技术标签:

【中文标题】在 FirebaseRecyclerAdapter 上应用过滤器【英文标题】:Apply a filter on FirebaseRecyclerAdapter 【发布时间】:2016-11-20 21:38:45 【问题描述】:

我正在使用FirebaseRecyclerAdapter 来显示聊天消息。

private void attachRecyclerViewAdapter() 
    lastFifty = mChatRef.limitToLast(50).;
    mRecyclerViewAdapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(
            Chat.class, R.layout.message, ChatHolder.class, lastFifty) 

        @Override
        public void populateViewHolder(ChatHolder chatView, Chat chat, int position) 
            chatView.setName(chat.getName());
            chatView.setText(chat.getText());
            chatView.setTimeLocation(chat.getTime());
            FirebaseUser currentUser = mAuth.getCurrentUser();

            if (currentUser != null && chat.getUid().equals(currentUser.getUid())) 
                chatView.setIsSender(true);
             else 
                chatView.setIsSender(false);
            
        
    ;

我有一个包含特定用户列表的列表。我想应用过滤器以仅查看来自这些特定用户的消息。我该怎么办?

【问题讨论】:

有一个开放的feature request on FirebaseUI for adding the ability to filter。 最好的做法是尝试在服务器端进行过滤。您是否考虑过阻止用户向他们尚未添加或已阻止的其他用户发送消息?在我正在开发的应用程序中,我允许用户添加他们想要的任何用户,但我只允许他们在其他用户也添加了他们的情况下发送消息。 -1 否决票您是否考虑在 Firebase 数据库上为这些特定用户使用专用节点? 你在尝试实现群聊吗? 【参考方案1】:

您可以使用用户 ID 对节点创建消息。例如 messages->'uid1-uid2'->...

为了防止哪个是一阶 uid,就像下面的 messageId 生成器代码所做的那样:

public static String getMessageId(String id1, String id2)
        String messageId;

        if(id1.compareTo(id2) < 0)
            messageId = id1 + "-" + id2;
        else if(id1.compareTo(id2) > 0) 
            messageId = id2 + "-" + id1;
        else
            messageId = id1;
        

        return messageId;
    

当你想查看用户和你自己的聊天记录时,获取用户的id并生成messageId = getMessageId(id1, id2); or messageId = getMessageId(id2, id1);会得到相同的结果,因为顺序不影响结果。

然后从节点messages -> messageId

调用消息

P.S. 你应该按照我的描述重新构建你的消息节点。

编辑

您可以将 messageId 转换为 md5 等价于保存字符。

改变一下

return messageId;

return md5(messageId);

md5 在哪里:

public static String md5(final String s) 
    try 
        // Create MD5 Hash
        MessageDigest digest = java.security.MessageDigest
                .getInstance("MD5");
        digest.update(s.getBytes());
        byte messageDigest[] = digest.digest();

        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < messageDigest.length; i++) 
            String h = Integer.toHexString(0xFF & messageDigest[i]);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        
        return hexString.toString();

     catch (NoSuchAlgorithmException e) 
        e.printStackTrace();
    
    return "";

【讨论】:

以上是关于在 FirebaseRecyclerAdapter 上应用过滤器的主要内容,如果未能解决你的问题,请参考以下文章

我在 FirebaseRecyclerAdapter 类中找不到 populateViewHolder 方法

populateViewHolder 未使用 FirebaseRecyclerAdapter (Android) 执行

如何更新 FirebaseRecyclerAdapter 查询

onChild 在 FirebaseRecyclerAdapter 中添加

如何在 FirebaseRecyclerAdapter 上获取用户 ID 的价值?

我应该使用不同的数据结构还是过滤 FirebaseRecyclerAdapter? [复制]