Применить фильтр к FirebaseRecyclerAdapter

Я использую 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);
            }
        }
    };

У меня есть список, содержащий список конкретных пользователей. Я хотел бы применить фильтр, чтобы видеть только сообщения от этих конкретных пользователей. Что я должен делать ?


person user655561    schedule 18.07.2016    source источник
comment
В FirebaseUI есть открытый запрос на добавление возможности фильтрации.   -  person Frank van Puffelen    schedule 18.07.2016
comment
Всегда было бы лучше попытаться выполнить фильтрацию на стороне сервера. Вы пытались запретить пользователям отправлять сообщения другим пользователям, которых они еще не добавили или не заблокировали? В приложении, над которым я работаю, я разрешаю пользователям добавлять любого пользователя, которого они хотят, но я разрешаю им отправлять сообщения только в том случае, если другой пользователь также добавил их.   -  person Riley MacDonald    schedule 04.09.2016
comment
-1 голос против. Рассматривали ли вы возможность использования выделенного узла в базе данных Firebase для этих конкретных пользователей?   -  person Andrey    schedule 06.09.2016
comment
Вы пытаетесь реализовать групповой чат?   -  person Deepak John    schedule 07.09.2016


Ответы (1)


Вы можете создавать сообщения с узлами пары идентификаторов пользователей. Например, 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;
    }

Если вы хотите просмотреть историю чата между пользователем и собой, получите идентификатор пользователя и сгенерируйте messageId = getMessageId(id1, id2); or messageId = getMessageId(id2, id1);, чтобы получить тот же результат, поскольку порядок не влияет на результат.

Затем вызовите сообщения из узла messages -> messageId.

P.S. вам следует изменить структуру узла сообщений, как я описал.

ИЗМЕНИТЬ

Вы можете преобразовать messageId в эквивалент md5, чтобы сохранить символы.

просто измени

return messageId;

to

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 "";
}
person ugur    schedule 07.09.2016