2016-07-18 3 views
19

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

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

+0

Существует открытый [запрос функции на FirebaseUI для добавления способности фильтровать] (HTTPS: //github.com/firebase/FirebaseUI-Android/issues/15). –

+1

Всегда было бы лучше всего попробовать и выполнить фильтрацию на стороне сервера. Вы забыли, чтобы пользователи не отправляли сообщения другим пользователям, которых они еще не добавили или заблокировали? В приложении, над которым я работаю, я разрешаю пользователям добавлять любого пользователя, которого они хотят, но я разрешаю им отправлять сообщения, если другой пользователь также добавил их. –

+1

-1 \t Вы рассмотрели использование выделенного узла в базе данных Firebase для этих конкретных пользователей? – Andrea

ответ

2

Вы можете создавать сообщения с узлами пары идентификаторов пользователя. Например сообщения -> 'UID1-UID2' -> ...

Чтобы предотвратить который UIDs первого порядка alphatecially в качестве следующего кода 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; 
    } 

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

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

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

EDIT

Вы можете конвертировать 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 ""; 
}