Android实现类似微信的聊天UI

jopen 9年前


先看主页面布局

activity_imitate_weixin_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:background="#f0f0e0" >          <RelativeLayout          android:id="@+id/rl_bottom"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_alignParentBottom="true"          android:background="@drawable/weixin_layout_bg1" >            <Button              android:id="@+id/btn_send"              android:layout_width="60dp"              android:layout_height="40dp"              android:layout_alignParentRight="true"              android:layout_centerVertical="true"              android:layout_marginRight="10dp"              android:text="发送" />            <EditText              android:id="@+id/et_sendmessage"              android:layout_width="fill_parent"              android:layout_height="40dp"              android:layout_centerVertical="true"              android:layout_marginLeft="10dp"              android:layout_marginRight="10dp"              android:layout_toLeftOf="@id/btn_send"              android:background="@drawable/weixin_edittext1"              android:singleLine="true"              android:textSize="18sp" />      </RelativeLayout>        <ListView          android:id="@+id/listview"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:layout_above="@id/rl_bottom"          android:layout_marginLeft="10.0dip"          android:layout_marginRight="10.0dip"          android:layout_marginTop="10.0dip"          android:cacheColorHint="#00000000"          android:divider="@null"          android:dividerHeight="5dp"          android:scrollbars="none" />    </RelativeLayout>

再看入口WeixinChatDemoActivity



package com.example.weixindemo;    import java.text.SimpleDateFormat;  import java.util.ArrayList;  import java.util.Date;  import java.util.List;    import android.app.Activity;  import android.os.Bundle;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.EditText;  import android.widget.ListView;  /**   * 仿微信主页面   */  public class WeixinChatDemoActivity extends Activity implements OnClickListener {     private Button mBtnSend;// 发送btn   private EditText mEditTextContent;   private ListView mListView;   private ChatMsgViewAdapter mAdapter;// 消息视图的Adapter   private List<ChatMsgEntity> mDataArrays = new ArrayList<ChatMsgEntity>();// 消息对象数组     private final static int COUNT = 1;// 初始化数组总数     @Override   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_imitate_weixin_main);    initView();   }      public void initView() {    mListView = (ListView) findViewById(R.id.listview);    mBtnSend = (Button) findViewById(R.id.btn_send);    mEditTextContent = (EditText) findViewById(R.id.et_sendmessage);    initData();// 初始化数据        mBtnSend.setOnClickListener(this);    mListView.setSelection(mAdapter.getCount() - 1);   }        /**    * 模拟加载消息历史,实际开发可以从数据库中读出    */   public void initData() {    for (int i = 0; i < COUNT; i++) {     ChatMsgEntity entity = new ChatMsgEntity();     entity.setDate("2012-09-22 18:00:02");     if (i % 2 == 0) {      entity.setName("他人");      entity.setMsgType(true);// 收到的消息     } else {      entity.setName("本人");      entity.setMsgType(false);// 自己发送的消息     }     entity.setMessage("今晚去网吧包夜吧?");     mDataArrays.add(entity);    }      mAdapter = new ChatMsgViewAdapter(this, mDataArrays);    mListView.setAdapter(mAdapter);   }     @Override   public void onClick(View v) {    switch (v.getId()) {    case R.id.btn_send:// 发送按钮点击事件     send();     break;    }   }     /**    * 发送消息    */   private void send() {    String contString = mEditTextContent.getText().toString();    if (contString.length() > 0) {     ChatMsgEntity entity = new ChatMsgEntity();     entity.setName("本人");     entity.setDate(getDate());     entity.setMessage(contString);     entity.setMsgType(false);       mDataArrays.add(entity);     mAdapter.notifyDataSetChanged();// 通知ListView,数据已发生改变       mEditTextContent.setText("");// 清空编辑框数据       mListView.setSelection(mListView.getCount() - 1);// 发送一条消息时,ListView显示选择最后一项    }   }     /**    * 发送消息时,获取当前事件    *     * @return 当前时间    */   private String getDate() {    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");    return format.format(new Date());   }       }

再看适配器


ChatMsgViewAdapter


package com.example.weixindemo;  import java.util.List;  import android.content.Context;  import android.view.LayoutInflater;  import android.view.View;  import android.view.ViewGroup;  import android.widget.BaseAdapter;  import android.widget.TextView;  /**   * 消息ListView的Adapter   */  public class ChatMsgViewAdapter extends BaseAdapter {     private List<ChatMsgEntity> coll;// 消息对象数组   private LayoutInflater mInflater;     public ChatMsgViewAdapter(Context context, List<ChatMsgEntity> coll) {    this.coll = coll;    mInflater = LayoutInflater.from(context);   }     /*****************************************************/   //得到Item的类型,是对方发过来的消息,还是自己发送出去的   public int getItemViewType(int position) {    return coll.get(position).getMsgType()?1:0;   }   //Item类型的总数   public int getViewTypeCount() {    return 2;   }   /******************************************************/   public int getCount() {    return coll.size();   }     public Object getItem(int position) {    return coll.get(position);   }     public long getItemId(int position) {    return position;   }       public View getView(int position, View convertView, ViewGroup parent) {      ChatMsgEntity entity = coll.get(position);    boolean isComMsg = entity.getMsgType();      ViewHolder viewHolder = null;    if (convertView == null) {     if (isComMsg) {      convertView = mInflater.inflate(        R.layout.activity_imitate_weixin_chatting_item_msg_text_left, null);     } else {      convertView = mInflater.inflate(        R.layout.activity_imitate_weixin_chatting_item_msg_text_right, null);     }       viewHolder = new ViewHolder();     viewHolder.tvSendTime = (TextView) convertView       .findViewById(R.id.tv_sendtime);     viewHolder.tvUserName = (TextView) convertView       .findViewById(R.id.tv_username);     viewHolder.tvContent = (TextView) convertView       .findViewById(R.id.tv_chatcontent);     viewHolder.isComMsg = isComMsg;       convertView.setTag(viewHolder);    } else {     viewHolder = (ViewHolder) convertView.getTag();    }    viewHolder.tvSendTime.setText(entity.getDate());    viewHolder.tvUserName.setText(entity.getName());    viewHolder.tvContent.setText(entity.getMessage());    return convertView;   }     static class ViewHolder {    public TextView tvSendTime;    public TextView tvUserName;    public TextView tvContent;    public boolean isComMsg = true;   }    }

另外还辅助的bean类


ChatMsgEntity


package com.example.weixindemo;    /**   * 一个消息的JavaBean   */  public class ChatMsgEntity {   private String name;//消息来自   private String date;//消息日期   private String message;//消息内容   private boolean isComMeg = true;// 是否为收到的消息     public String getName() {    return name;   }     public void setName(String name) {    this.name = name;   }     public String getDate() {    return date;   }     public void setDate(String date) {    this.date = date;   }     public String getMessage() {    return message;   }     public void setMessage(String message) {    this.message = message;   }     public boolean getMsgType() {    return isComMeg;   }     public void setMsgType(boolean isComMsg) {    isComMeg = isComMsg;   }     public ChatMsgEntity() {   }     public ChatMsgEntity(String name, String date, String text, boolean isComMsg) {    super();    this.name = name;    this.date = date;    this.message = text;    this.isComMeg = isComMsg;   }    }

另外还有聊天界面本人、他人的布局文件


activity_imitate_weixin_chatting_item_msg_text_left.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:orientation="vertical"      android:padding="6dp" >        <LinearLayout          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:gravity="center_horizontal"          android:orientation="vertical" >            <TextView              android:id="@+id/tv_sendtime"              style="@style/chat_text_date_style"              android:layout_width="wrap_content"              android:layout_height="wrap_content" />      </LinearLayout>        <RelativeLayout          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_marginTop="5dp" >            <ImageView              android:id="@+id/iv_userhead"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentLeft="true"              android:layout_alignParentTop="true"              android:background="@drawable/weixin_mini_avatar_shadow"              android:focusable="false" />            <TextView              android:id="@+id/tv_chatcontent"              style="@style/chat_content_date_style"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginLeft="10dp"              android:layout_toRightOf="@id/iv_userhead"              android:background="@drawable/weixin_chatfrom_bg_normal" />            <TextView              android:id="@+id/tv_username"              style="@style/chat_text_name_style"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentLeft="true"              android:layout_below="@id/iv_userhead"              android:layout_toLeftOf="@id/tv_chatcontent" />      </RelativeLayout>    </LinearLayout>

activity_imitate_weixin_chatting_item_msg_text_right.xml



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:orientation="vertical"      android:padding="6dp" >        <LinearLayout          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:gravity="center_horizontal"          android:orientation="vertical" >            <TextView              android:id="@+id/tv_sendtime"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:background="#bfbfbf"              android:padding="2dp"              android:textColor="#ffffff"              android:textSize="12sp" />      </LinearLayout>        <RelativeLayout          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:layout_marginTop="5dp" >            <ImageView              android:id="@+id/iv_userhead"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentRight="true"              android:layout_alignParentTop="true"              android:background="@drawable/weixin_mini_avatar_shadow"              android:focusable="false" />            <TextView              android:id="@+id/tv_chatcontent"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_marginRight="10dp"              android:layout_toLeftOf="@id/iv_userhead"              android:background="@drawable/weixin_chatto_bg_normal"              android:clickable="true"              android:focusable="true"              android:gravity="left|center"              android:lineSpacingExtra="2dp"              android:minHeight="50dp"              android:textColor="#ff000000"              android:textSize="15sp" />            <TextView              android:id="@+id/tv_username"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentRight="true"              android:layout_below="@id/iv_userhead"              android:layout_toRightOf="@id/tv_chatcontent"              android:gravity="center"              android:textColor="#818181"              android:textSize="15sp" />      </RelativeLayout>    </LinearLayout>
来自:http://blog.csdn.net/u013210620/article/details/46430003