2017-08-28 8 views
0

Ich verwende die Firebase-API. Nachrichten senden und abrufen. Jedoch habe ich Probleme beim Versuch Layout für den Sender/Retriever so zu setzen, dass Nachrichten links/rechts ausgerichtet werden. Im Moment habe ich nur ein Layout, das sowohl der Sender/Retriever verwendet, aber nicht sicher ist, wie man verschiedene Layouts einstellt.Nachrichten nach links/rechts ausrichten

public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> { 

    private List<Message> messagesList; 

    private DatabaseReference databaseReference; 
    private DatabaseReference userDatabaseRef; 
    private FirebaseAuth firebaseAuth; 
    private Context context; 
    private String imageUrl; 


    public MessageAdapter(List<Message> messagesList) { 
     this.messagesList = messagesList; 
    } 

    @Override 
    public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Message c = messagesList.get(viewType); 
     String sender = c.getFrom(); 
     databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender); 

      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.messages_layout, parent, false); 
      return new MessageViewHolder(v); 


    } 



    @Override 
    public void onBindViewHolder(final MessageViewHolder viewHolder, final int index) { 


     final Message c = messagesList.get(index); 

     final String sender = c.getFrom(); 

     databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender); 

     databaseReference.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       imageUrl = dataSnapshot.child("image").getValue(String.class); 

       viewHolder.setUserimage(context,imageUrl); 


       String name = dataSnapshot.child("name").getValue().toString(); 
       viewHolder.displayName.setText(name); 

      } 
      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 

     }); 

     viewHolder.messageText.setText(c.getMessage()); 
     viewHolder.time.setText(EpochtimeToDateAndTimeString(c.getTime())); 
    } 

    @Override 
    public int getItemCount() { 
     return messagesList.size(); 
    } 


    public String EpochtimeToDateAndTimeString(long time) { 
     Date date = new Date(time); 
     DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     format.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
     String formatted = format.format(date); 
     return formatted; 
    } 



} 

MessageViewHolder

public class MessageViewHolder extends RecyclerView.ViewHolder { 
public TextView messageText; 
public TextView displayName; 
public TextView time; 
public ImageView showImage; 

public MessageViewHolder(View view) { 
    super(view); 
    messageText = (TextView) view.findViewById(R.id.messagetext); 
    displayName = (TextView) view.findViewById(R.id.displayname); 
    time = (TextView) view.findViewById(R.id.timestamp); 
    showImage = (ImageView) view.findViewById(R.id.imageview_post_userimage3); 
} 

Antwort

0

Sie andere Sicht Halter für Absenders und des Empfängers Nachrichten verwendet werden soll.

Erstellen Sie zwei Layouts: R.layout.sender_message_layout und R.layout.receiver_message_layout

zwei viewholders erstellen: SenderMessageHolder und ReceiverMessageHolder.

definieren Ansichtstyp Integer-Konstanten:

public static final int VIEW_TYPE_SENDER = 1; 
public static final int VIEW_TYPE_RECEIVER = 2; 

Implementieren getItemViewType(int position) auf Ihrem Adapter:

if(messageList.get(position).getFrom().equals(...)) { 
    return VIEW_TYPE_SENDER; 
} else { 
    return VIEW_TYPE_RECEIVER; 
} 

In onCreateViewHolder() Funktionskontrolle Sichttyp und Träger schaffen für unterschiedliche Absender:

View v; 

if(viewType == VIEW_TYPE_SENDER) { 
    v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.sender_message_layout, parent, false); 
    return new SenderMessageHolder(v); 
} else { 
    v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.receiver_message_layout, parent, false); 
    return new ReceiverMessageHolder(v); 
} 

In onBindViewHolder() Kontrollhalter Instanz zu binden Werte Ansichten entsprechend:

if(holder instanceof SenderMessageHolder) { 
    ((SenderMessageHolder) holder).textView.setText(...); 
    ... 
} else { 
    ((ReceiverMessageHolder) holder).textView.setText(...); 
    ... 
} 

Hoffnung, dass es hilft!

0

Es gibt mehrere Möglichkeiten, dies zu tun. Die Art und Weise, die ich empfehlen würde, ist durch Überschreiben der public int getItemViewType(int position) für Ihren Adapter. Sie müssen hier eine Logik implementieren, die Ihnen hilft, die Layoutdatei zu ermitteln, die zurückgegeben werden soll, und eine Ansichtsartkonstante zurückzugeben.

public static int INCOMING = 1; 
public static int OUTGOING = 2; 

    @Override 
public int getItemViewType(int position) { 
    int viewType = -1;  
    Message m = messagesList.get(position) 
    //Logic here determining if m is left or right aligned and 
    // return either 
    // MessageAdapter.OUTGOING OR MessageAdapter.INCOMING 
    return viewType; 
} 

Erstellen Sie eine linksbündige Layoutdatei und eine rechtsbündige Layoutdatei. Ihre neue onCreateviewHolder() Adaptermethode sieht ungefähr so ​​aus:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Message c = messagesList.get(viewType); 
    String sender = c.getFrom(); 
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(sender); 

    View v; 

    if(viewType == MessageAdapter.INCOMING) { 
     v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.messages_layout_left, parent, false); 
    }else if (viewType == MessageAdapter.OUTGOING) { 
     v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.messages_layout_right, parent, false); 
    } 


    return new MessageViewHolder(v); 


} 
+0

Vielen Dank für Ihre Antwort. Können Sie mir mit Logik helfen zu bestimmen, ob m links oder rechts ist bitte –

+0

auch ich bin nicht sicher, wo getItemViewtype aufgerufen wird? –

+0

'getItemViewType' wird vom Adapter aufgerufen. Die Logik zum Bestimmen, ob m links oder rechts ist, hängt von dem "Nachricht" -Objekt ab. Von Ihrem Code oben haben Sie 'm.getSender()', das Sie mit dem gegenwärtigen Benutzer vergleichen konnten? Vielleicht etwas wie: 'return m.getSender(). Equals (currentUser.name())? INCOMING: OUTGOING; ' – morenoadan22