2016-07-18 15 views
19

Używam FirebaseRecyclerAdapter do wyświetlania wiadomości na czacie.Zastosuj filtr w 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); 
      } 
     } 
    }; 

Mam listę zawierającą listę konkretnych użytkowników. Chciałbym zastosować filtr, aby zobaczyć tylko wiadomości od tych konkretnych użytkowników. Co powinienem zrobić ?

+0

Jest otwarty [cecha prośba o FirebaseUI dodawania zdolność filtru] (https: //github.com/firebase/FirebaseUI-Android/issues/15). –

+1

Najlepszym rozwiązaniem jest wykonanie filtrowania po stronie serwera. Czy zastanawiałeś się, czy powstrzymać użytkowników przed wysyłaniem wiadomości do innych użytkowników, których jeszcze nie dodali lub nie zablokowali? W aplikacji, w której pracuję, pozwalam użytkownikom dodawać dowolnych użytkowników, ale pozwalam im tylko na wysyłanie wiadomości, jeśli inny użytkownik je dodał. –

+1

-1 w dół głosowanie \t Czy rozważałeś użycie dedykowanego węzła w bazie danych Firebase dla tych konkretnych użytkowników? – Andrea

Odpowiedz

2

Można tworzyć wiadomości z węzłami identyfikatora użytkownika. Dla przykładu komunikaty -> 'uid1-uid2' -> ...

Aby zapobiec który jest pierwszym UID zamówień alphatecially jako poniższym kodzie generatora komunikatu robi:

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; 
    } 

Gdy chcesz zobacz historię czatu między użytkownikiem a sobą, uzyskaj identyfikator użytkownika i wygeneruj ten sam wynik, ponieważ zamówienie nie ma wpływu na wynik.

następnie wywołać wiadomości z węzła wiadomości -> komunikatu

PS: powinieneś przebudować swój węzeł komunikatów, tak jak opisuję.

EDIT

Można konwertować komunikatu do ekwiwalentu md5, aby zapisać znaki.

wystarczy zmienić

return messageId; 

do

return md5(messageId); 

gdzie md5 jest:

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 ""; 
}