2016-07-18 230 views
19

Sto usando FirebaseRecyclerAdapter per visualizzare i messaggi di chat.Applicare un filtro su 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); 
      } 
     } 
    }; 

Ho una lista che contiene un elenco di utenti specifici. Vorrei applicare il filtro per vedere solo i messaggi di quegli utenti specifici. Cosa dovrei fare ?

+0

C'è un open [richiesta di funzionalità su FirebaseUI per aggiungendo la possibilità di filtrare] (https: //github.com/firebase/FirebaseUI-Android/issues/15). –

+1

Sarebbe sempre consigliabile provare a fare il filtraggio sul lato server. Hai cercato di impedire agli utenti di inviare messaggi ad altri utenti che non hanno ancora aggiunto o bloccato? In un'app a cui sto lavorando consento agli utenti di aggiungere qualsiasi utente desiderino, ma consentirò loro di inviare messaggi solo se l'altro utente li ha aggiunti. –

+1

-1 down vote \t hai considerato l'utilizzo di un nodo dedicato nel database Firebase per quegli utenti specifici? – Andrea

risposta

2

È possibile creare messaggi con nodi della coppia ID utente. Ad esempio messaggi -> 'uid1-uid2' -> ...

Per evitare che è primo uid ordine alphatecially come il seguente codice generatore messageId fa:

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

Quando si desidera vedere la cronologia della chat tra un utente e urself, ottenere l'id dell'utente e generare messageId = getMessageId(id1, id2); or messageId = getMessageId(id2, id1); dà lo stesso risultato poiché l'ordine non influisce sul risultato.

Quindi chiamare i messaggi dal nodo messaggi -> messageId

P.S. si dovrebbe ristrutturare il nodo dei messaggi come descritto.

EDIT

È possibile convertire messageId per md5 equivalente per salvare caratteri.

basta cambiare

return messageId; 

a

return md5(messageId); 

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