android实现气泡聊天
学会使用Listview及其优化,再就是用了一个自定义的聊天气泡控件。
首先,先写主页面的xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView //显示聊天内容 android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="0dp" android:divider="#0000" android:layout_weight="1"> </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="5dp" > <EditText android:id="@+id/input_et" //输入要发送的信息 android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="input message" android:maxLines="2"/> <Button android:id="@+id/send //发送信息按钮 android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#66cc99" android:text="send"/> </LinearLayout> </LinearLayout>
接着 定义消息的实体类,新建Msg类:
public class Msg {public static int RECEIVED = 0; //收到的消息 public static int SENT = 1; //发送的消息 private String content; private int type; public Msg(String content,int type){this.content = content; //消息内容 this.type = type; //消息类型 }public String getContent(){return content; }public int getType(){return type; } }
接着,开始写ListView的子页面,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="wrap_content"> //左边的气泡(注意,在在build.gradle里面增加
compile 'com.lguipeng.bubbleview:library:1.0.0',不会的看链接: http://blog.csdn.net/bi_diu1368/article/details/51491646 ) <com.github.library.bubbleview.BubbleTextVew
android:id="@+id/left_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="20sp" android:padding="10dp" android:textColor="@android:color/white" app:arrowWidth="8dp" app:angle="8dp" app:arrowHeight="10dp" app:arrowPosition="14dp" app:arrowLocation="left" app:bubbleColor="#7EC0EE"/></LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end">//右边的气泡 <com.github.library.bubbleview.BubbleTextVew android:id="@+id/right_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="20sp" android:padding="10dp" android:textColor="@android:color/white" app:arrowWidth="8dp" app:angle="8dp" app:arrowHeight="10dp" app:arrowPosition="14dp" app:arrowLocation="right" app:bubbleColor="#7EC0EE"/> </LinearLayout></LinearLayout>
接下来需要创建ListView的适配器,让其继承ArrayAdapter,将类型指为Msg,代码如下:
public class MsgAdapter extends ArrayAdapter<Msg> {int resourced; public MsgAdapter(Context context,int textViewResourced,List<Msg> objects){super(context,textViewResourced,objects); resourced = textViewResourced; }@Override public View getView(int position, View convertView, ViewGroup parent) {Msg msg = getItem(position); View view; ViewHolder viewHolder; if(convertView == null){view = LayoutInflater.from(getContext()).inflate(resourced,null); viewHolder = new ViewHolder(); viewHolder.liftLayout = (LinearLayout)view.findViewById(R.id.left_layout); viewHolder.rightLayout = (LinearLayout)view.findViewById(R.id.right_layout); viewHolder.leftMsg = (TextView)view.findViewById(R.id.left_msg); viewHolder.rightMsg = (TextView)view.findViewById(R.id.right_msg); view.setTag(viewHolder); }else{view = convertView; viewHolder = (ViewHolder)view.getTag(); }if(msg.getType() == Msg.RECEIVED){viewHolder.liftLayout.setVisibility(View.VISIBLE); viewHolder.rightLayout.setVisibility(View.GONE); viewHolder.leftMsg.setText(msg.getContent()); }else if(msg.getType() == Msg.SENT){viewHolder.liftLayout.setVisibility(View.GONE); viewHolder.rightLayout.setVisibility(View.VISIBLE); viewHolder.rightMsg.setText(msg.getContent()); }return view; }class ViewHolder{LinearLayout liftLayout; LinearLayout rightLayout; TextView leftMsg; TextView rightMsg; } }
这里可以看出,代码对ListView做了优化,getView中,有一个convertView参数,这个参数将以前加载好的布局进行缓存,以便之后的重用。在getView中,对 convertView进行判断,如果为空,则使用LayoutInflater去加载布局,如果不为空,则直接可以对convertView进行重用。
每次在getView中,都要调用View的findViewById()来获取控件的实例。但是,我们可以借助ViewHolder来进行优化。建一个内部类viewHolder,用于对控件的实例进行缓存。当convertView为空是,创建一个viewolder的对象,将控件的实例放到viewHolder里面,调用view的setTag()方法对控件的实例进行保存。如果convertView不为空,调用view 的getTag(),把viewHolder全部取出来,这样所有的控件实例都还缓存在了viewHolder中,没有必要每次都通过findViewById()获取空间的实例。
接着,写MainActivity,为ListView初始一些数据,并给发送按钮加入事件的响应。
public class MainActivity extends Activity {private ListView listView; private EditText input_et; //信息输入 private Button send; //发送按钮 private MsgAdapter adapter; private List<Msg> msgList = new ArrayList<Msg>(); @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.content_main); initMsgList(); //为ListView初始化一些数据 adapter = new MsgAdapter(MainActivity.this,R.layout.msg_item,msgList); listView = (ListView)findViewById(R.id.list_view); input_et = (EditText)findViewById(R.id.input_et); send = (Button)findViewById(R.id.send); listView.setAdapter(adapter); send.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) {String content = input_et.getText().toString(); if(!"".equals(content)){Msg msg = new Msg(content,Msg.SENT); msgList.add(msg); adapter.notifyDataSetChanged(); //当有新消息时,刷新ListView的显示 listView.setSelection(msgList.size()); //将ListView定位到最后一行 input_et.setText(""); //清空输入框的内容 }}}); }public void initMsgList(){Msg msg1 = new Msg("Hello,Yan Xi.",Msg.RECEIVED); msgList.add(msg1); Msg msg2 = new Msg("Hello,Wen Heng.",Msg.SENT); msgList.add(msg2); Msg msg3 = new Msg("Miss You.",Msg.RECEIVED); msgList.add(msg3); } }
如图
android实现气泡聊天相关推荐
- 转-Android仿微信气泡聊天界面设计
微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素材,要用到9.png文件的素材,这样气 ...
- Android仿微信气泡聊天界面设计
Android仿微信气泡聊天界面设计 微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素 ...
- Android学习笔记——RecyclerView编写气泡聊天
声明 本次的代码部分参考郭霖--<第一行代码>,学习recyclerview章节后手动编写的. .9图制作 .9图素材是本人用Windows附件中的画图工具制作的(就是找不到资源),然后导 ...
- android气泡聊天消息背景,Android使用贝塞尔曲线仿QQ聊天消息气泡拖拽效果
本文实例为大家分享了Android仿QQ聊天消息气泡拖拽效果展示的具体代码,供大家参考,具体内容如下 先画圆,都会吧.代码如下: public class Bezier extends View { ...
- android模仿iphone气泡聊天 气泡大小自适应
这两天在做一个电子商城的商品评论功能,想到模仿微信或者iphone中的气泡聊天方式,气泡聊天是iphone内置的控件,不对开发者开放,android中更是没有提供类似的控件.于是先在百度google上 ...
- Android小项目————聊天室(UI篇)
Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...
- 纯CSS实现气泡聊天框的方法
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- android格式化时间中文版,Android 仿微信聊天时间格式化显示功能
本文给大家分享android仿微信聊天时间格式化显示功能. 在同一年的显示规则: 如果是当天显示格式为 HH:mm 例:14:45 如果是昨天,显示格式为 昨天 HH:mm 例:昨天 13:12 如果 ...
- android 仿微信聊天界面 以及语音录制功能,Android仿微信录制语音功能
本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下 前言 我把录音分成了两部分 1.UI界面,弹窗读秒 2.一个类(包含开始.停止.创建文件名功能) 第一部分 由于6 ...
最新文章
- JackJson 使用记录
- JFinal 源码导读第八天(1) Db.tx 事物
- java 类型转换的原理
- JS经典面试题05-变量连续声明var a = b = 1
- .net下模拟不同身份登陆以获取不同权限
- 数据算法之快速排序(quickSort)的Java实现
- 关于scrollTop
- redis java客户端封装_redis的java客户端Jedis简单封装
- bcdboot(引导修复工具) 命令行工具使用方法
- 推荐5款你用过之后不舍得卸载的小众软件
- 大学生创新创业大赛案例_大学生创新创业典型案例4
- Compose_23--动画之animateContentSize和Crossfade
- PS教程 | 美女面部剥落碎片效果
- 【算法专题】高精度之压位
- linux系统日志报错kernel,Linux 系统日志 kernel: __ratelimit: xxx callbacks suppressed-Fun言...
- 用MySQL数据库来处理中英文取首字母排序
- 训练SSD时,viz报错
- 一致性哈希算法原理详解
- 关于音频工作站的一些事儿
- 给李开复:“创新工厂”最大的问题