微信的聊天界面是挺漂亮的,每条消息都带一个气泡,给人一种很清新的感觉,其实实现起来也不是那么的难,下面我们就来实现一下。
老规矩,先贴上源代码:http://download.csdn.net/detail/weidi1989/4588782
再来看一下实现的效果图:

OK,下面我们来看一下整个小项目的主体结构:

下面是Activity的代码:
package com.way.demo;
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;
/**
* @author way
*/
public class WeixinChatDemoActivity extends Activity implements OnClickListener {
private Button mBtnSend;// 发送btn
private Button mBtnBack;// 返回btn
private EditText mEditTextContent;
private ListView mListView;
private ChatMsgViewAdapter mAdapter;// 消息视图的Adapter
private List<ChatMsgEntity> mDataArrays = new ArrayList<ChatMsgEntity>();// 消息对象数组
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();// 初始化view
initData();// 初始化数据
mListView.setSelection(mAdapter.getCount() - 1);
}
/**
* 初始化view
*/
public void initView() {
mListView = (ListView) findViewById(R.id.listview);
mBtnSend = (Button) findViewById(R.id.btn_send);
mBtnSend.setOnClickListener(this);
mBtnBack = (Button) findViewById(R.id.btn_back);
mBtnBack.setOnClickListener(this);
mEditTextContent = (EditText) findViewById(R.id.et_sendmessage);
}
private String[] msgArray = new String[] { "有大吗", "有!你呢?", "我也有", "那上吧",
"打啊!你放大啊!", "你TM咋不放大呢?留大抢人头啊?CAO!你个菜B", "2B不解释", "尼滚...",
"今晚去网吧包夜吧?", "有毛片吗?", "种子一大堆啊~还怕没片?", "OK,搞起!!" };
private String[] dataArray = new String[] { "2012-09-22 18:00:02",
"2012-09-22 18:10:22", "2012-09-22 18:11:24",
"2012-09-22 18:20:23", "2012-09-22 18:30:31",
"2012-09-22 18:35:37", "2012-09-22 18:40:13",
"2012-09-22 18:50:26", "2012-09-22 18:52:57",
"2012-09-22 18:55:11", "2012-09-22 18:56:45",
"2012-09-22 18:57:33", };
private final static int COUNT = 12;// 初始化数组总数
/**
* 模拟加载消息历史,实际开发可以从数据库中读出
*/
public void initData() {
for (int i = 0; i < COUNT; i++) {
ChatMsgEntity entity = new ChatMsgEntity();
entity.setDate(dataArray[i]);
if (i % 2 == 0) {
entity.setName("肖B");
entity.setMsgType(true);// 收到的消息
} else {
entity.setName("必败");
entity.setMsgType(false);// 自己发送的消息
}
entity.setMessage(msgArray[i]);
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;
case R.id.btn_back:// 返回按钮点击事件
finish();// 结束,实际开发中,可以返回主界面
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());
}
}
ListView的代码:
package com.way.demo;
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
*
* @author way
*/
public class ChatMsgViewAdapter extends BaseAdapter {
public static interface IMsgViewType {
int IMVT_COM_MSG = 0;// 收到对方的消息
int IMVT_TO_MSG = 1;// 自己发送出去的消息
}
private static final int ITEMCOUNT = 2;// 消息类型的总数
private List<ChatMsgEntity> coll;// 消息对象数组
private LayoutInflater mInflater;
public ChatMsgViewAdapter(Context context, List<ChatMsgEntity> coll) {
this.coll = coll;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return coll.size();
}
public Object getItem(int position) {
return coll.get(position);
}
public long getItemId(int position) {
return position;
}
/**
* 得到Item的类型,是对方发过来的消息,还是自己发送出去的
*/
public int getItemViewType(int position) {
ChatMsgEntity entity = coll.get(position);
if (entity.getMsgType()) {//收到的消息
return IMsgViewType.IMVT_COM_MSG;
} else {//自己发送的消息
return IMsgViewType.IMVT_TO_MSG;
}
}
/**
* Item类型的总数
*/
public int getViewTypeCount() {
return ITEMCOUNT;
}
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.chatting_item_msg_text_left, null);
} else {
convertView = mInflater.inflate(
R.layout.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;
}
}
消息对象的代码:
package com.way.demo;
/**
* 一个消息的JavaBean
*
* @author way
*
*/
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;
}
}
OK,大功告成,大家耐心点看看吧,文字比较少。
分享到:
相关推荐
综上所述,"android高仿微信聊天界面"项目涵盖了Android应用开发的多个重要知识点,包括UI设计、传感器交互、网络通信、数据存储和性能优化等,对于提升开发者在实际项目中的技能和经验具有很高的价值。通过这个项目...
在Android开发中,仿微信聊天界面是一个常见的需求,它涉及到许多关键技术和组件的集成。这个项目可能包括消息列表的展示、输入框设计、表情键盘、发送按钮、未读消息提示等多个方面。以下是一些相关的重要知识点: ...
在Android平台上,构建一个高仿微信聊天界面是一个常见的任务,涉及到UI设计、数据管理以及用户交互等多个方面。本文将深入探讨实现这一目标的关键知识点,并基于提供的"demo"压缩包文件来解析实现步骤。 首先,...
在Android平台上,构建一个类似微信的聊天界面是一个常见的需求,涉及到多个关键技术点。这个项目,"HRChatDemo",显然就是一个实现这一目标的示例应用。让我们深入探讨一下其中涉及的关键技术及其细节。 首先,...
"Android应用源码之高仿微信"是一个关于Android开发的项目,旨在模仿微信这款流行的社交应用程序的功能和界面。这个标题表明我们将会深入到Android应用的开发细节中,学习如何构建一个类似微信的用户界面和交互逻辑...
《Android 完美高仿微信源码解析》 在移动应用开发领域,微信作为一个全球知名的社交平台,其用户界面和交互设计备受开发者们的关注。"Android 完美高仿的微信源码"是一个专为Android开发者提供的学习资源,旨在...
Android ViewPager+Fragment超高仿微信主界面(带底部图标切换动画)Android ViewPager+Fragment超高仿微信主界面(带底部图标切换动画)Android ViewPager+Fragment超高仿微信主界面(带底部图标切换动画)
在本文中,我们将深入探讨如何基于Android Studio开发一个高仿微信的应用程序。Android Studio是Google提供的官方集成开发环境(IDE),特别适用于Android应用的开发。它提供了丰富的工具集,包括代码编辑器、调试器...
综上所述,"Android高仿微信的聊天界面"项目涵盖了Android UI设计、ListView优化、自定义Adapter、视图复用技术、布局设计、事件处理等多个知识点,对于提升Android开发者在用户体验设计和性能优化方面的技能具有...
基于android平台高仿微信5.3主界面,该工程主要修改自http://blog.csdn.net/guolin_blog/article/details/26365683页面提供的仿微信工程。本人主要工作为在原工程基础上重写tab页面切换方式,将原工程自绘方式改为...
总之,"Android高仿微信实时聊天"项目涵盖了Android开发的多个关键领域,包括UI设计、网络通信、数据存储、多线程、异步处理、第三方库集成等。通过这个项目,开发者可以全面提升自己的Android应用开发技能,并对...
【Android 高仿微信6.0主界面程序源码】是一个Android开发项目,旨在通过代码实现与微信6.0版本主界面高度相似的用户界面。这个项目是基于CSDN博主lmj623565791的博客文章详细讲解的,如果有任何疑问或需要进一步的...
高仿微信6.0主界面 1.使用viewpager+fragment 编写 主界面的 tab bar; 2.自定义 OverflowButton 修改button 图标; 3.修改 tab 图标颜色 切换; 4.解决内存 杀去导致 图标和view 不一致;
在高仿微信主界面的设计中,我们通常会用到ActionBar的Tab功能来实现底部的导航栏,每个Tab对应一个不同的页面或功能模块。这可以通过使用`ActionBar.Tab`接口来实现,或者在Android 3.0及以上版本中使用`android....
高仿微信主界面设计是一个应用Android ActionBar的高仿微信主界面设计的例子源码。只有主页面、搜索、弹出菜单和tab页的设计,没有实际的功能。
1. **样式和主题**:为了达到微信界面的效果,可能需要自定义ActionBar的主题和样式。这可以通过在`res/values/styles.xml`文件中定义新的主题实现,比如更改背景颜色、文字颜色等。 2. **导航模式**:微信主界面...
"android实现超高仿微信终极图片选择器"项目就是一个致力于满足这一需求的开源解决方案。下面我们将深入探讨这个项目的各个关键知识点。 1. **图片选择器的设计** - **多模式选择**:该选择器支持单选和多选两种...