Whatsapp Message Layout - How to get time-view in the same row

后端 未结 12 1105
执笔经年
执笔经年 2020-11-28 03:18

I was wondering how WhatsApp handles the time shown in every message.

For those who don\'t know:

  1. If the message is very short, the text and time are in
12条回答
  •  不知归路
    2020-11-28 04:12

    layout_chat_left.xml

    
    
    
    
    
        
    
        
    
        
    
    
    
    
    
    

    layout_chat_right.xml

    
    
    
    
    
        
    
        
    
        
    
    
    
    
    
    

    bg_msg_left.xml

    
    
    
    
    
    
    
    
    
    
    
    

    bg_msg_right.xml

    
    
    
    
    
    
    
    
    
    
    
    

    v_bubble_corner_left.xml

    
    
        
    
    

    v_bubble_corner_right.xml

    
    
    
    
    

    And the CommentAdapter.java is

    import android.content.Context;
    import android.graphics.Color;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import com.daimajia.androidanimations.library.Techniques;
    import com.daimajia.androidanimations.library.YoYo;
    import com.google.android.material.card.MaterialCardView;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class CommentAdapter extends RecyclerView.Adapter {
    
    private List mComment;
    private List mTimeData;
    private List mIcon;
    private List mDirection;
    private List mRecordID;
    private Context mContext;
    private LayoutInflater mInflater;
    private static final String TAG = "CommentAdapter";
    private ItemLongClickListener mLongClickListener;
    
    // data is passed into the constructor
    CommentAdapter(Context context, List dataComment, List dataTimeData, List dataDirection, List dataRecordID) {
        mContext = context;
        this.mInflater = LayoutInflater.from( context );
        this.mComment = dataComment;
        this.mTimeData = dataTimeData;
        this.mDirection = dataDirection;
        this.mRecordID = dataRecordID;
    }
    
    // inflates the row layout from xml when needed
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        if (viewType == 1) {
            view = mInflater.inflate( R.layout.layout_chat_left, parent, false );
        } else {
            view = mInflater.inflate( R.layout.layout_chat_right, parent, false );
        }
    
    
        return new ViewHolder( view );
    }
    
    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String mTitle = mComment.get( position );
        holder.tvComment.setText( mTitle );
        String mSubTitle = mTimeData.get( position );
        holder.tvTime.setText( mSubTitle );
        int maxWidth = mContext.getResources().getDisplayMetrics().widthPixels;
        holder.layoutChat.getLayoutParams().width = maxWidth;
    
    }
    
    // total number of rows
    @Override
    public int getItemCount() {
        return mComment.size();
    }
    
    
    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
        TextView tvComment;
        TextView tvTime;
        TextView tvSerial;
        RelativeLayout layoutChat;
        MaterialCardView cardView;
    
        ViewHolder(View itemView) {
            super( itemView );
            tvComment = itemView.findViewById( R.id.text );
            tvTime = itemView.findViewById( R.id.msg_time );
            layoutChat = itemView.findViewById( R.id.layoutChat );
            itemView.setOnLongClickListener( this );
    
        }
    
        @Override
        public boolean onLongClick(View v) {
            Log.d( TAG, "onLongClick: " + getAdapterPosition() );
            if (mLongClickListener!=null)
            mLongClickListener.onItemLongClick( v, mRecordID.get( getAdapterPosition() ) );
            return true;
        }
    }
    
    
    
    
    void setOnLongClickListener(ItemLongClickListener itemLongClickListener) {
        this.mLongClickListener = itemLongClickListener;
    }
    
    
    // parent activity will implement this method to respond to click events
    public interface ItemLongClickListener {
        void onItemLongClick(View view, int position);
    }
    
    @Override
    public int getItemViewType(int position) {
        if (mDirection.get( position ) == 1)
            return 1;
        return 2;
    }
    
    }
    

    Here are the screenshots, one from a live demo

提交回复
热议问题