2017-08-28 97 views
0

我使用的是firebase API。發送和檢索消息。但是,我在嘗試爲發送者/提取器設置佈局時遇到問題,所以消息將左對齊。目前,我只有一個佈局,發件人/提交者正在使用,但不知道如何設置不同的佈局。左右對齊消息

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

回答

0

,您應該使用不同的看法持有人發送方和接收方的消息。

創建兩個佈局:R.layout.sender_message_layoutR.layout.receiver_message_layout

創建兩個viewholders:SenderMessageHolderReceiverMessageHolder

定義視圖整型常量:

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

實現你的適配器上getItemViewType(int position)

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

onCreateViewHolder()功能檢查視圖類型,並針對不同的發送者創建不同的持有人:

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

在onBindViewHolder()支票夾實例值相應結合的觀點:

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

希望它可以幫助!

0

有幾種方法可以做到這一點。我建議的方式是覆蓋適配器的public int getItemViewType(int position)。您必須在此實現邏輯以幫助您確定要返回的佈局文件並返回視圖類型常量。

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

創建一個左對齊的佈局文件和一個右對齊的佈局文件。您的新onCreateviewHolder()適配器方法將如下所示:

@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

感謝您的回答。你能幫我確定是否左或右的邏輯,請 –

+0

也不知道getItemViewtype被調用的地方? –

+0

'getItemViewType'被適配器調用。確定m是左還是右的邏輯將取決於「消息」對象。從上面的代碼中,您可以將'm.getSender()'與當前用戶進行比較?可能類似於:'return m.getSender()。equals(currentUser.name())? INCOMING:OUTGOING;' – morenoadan22