学会使用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实现气泡聊天相关推荐

  1. 转-Android仿微信气泡聊天界面设计

    微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素材,要用到9.png文件的素材,这样气 ...

  2. Android仿微信气泡聊天界面设计

    Android仿微信气泡聊天界面设计 微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素 ...

  3. Android学习笔记——RecyclerView编写气泡聊天

    声明 本次的代码部分参考郭霖--<第一行代码>,学习recyclerview章节后手动编写的. .9图制作 .9图素材是本人用Windows附件中的画图工具制作的(就是找不到资源),然后导 ...

  4. android气泡聊天消息背景,Android使用贝塞尔曲线仿QQ聊天消息气泡拖拽效果

    本文实例为大家分享了Android仿QQ聊天消息气泡拖拽效果展示的具体代码,供大家参考,具体内容如下 先画圆,都会吧.代码如下: public class Bezier extends View { ...

  5. android模仿iphone气泡聊天 气泡大小自适应

    这两天在做一个电子商城的商品评论功能,想到模仿微信或者iphone中的气泡聊天方式,气泡聊天是iphone内置的控件,不对开发者开放,android中更是没有提供类似的控件.于是先在百度google上 ...

  6. Android小项目————聊天室(UI篇)

    Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...

  7. 纯CSS实现气泡聊天框的方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. android格式化时间中文版,Android 仿微信聊天时间格式化显示功能

    本文给大家分享android仿微信聊天时间格式化显示功能. 在同一年的显示规则: 如果是当天显示格式为 HH:mm 例:14:45 如果是昨天,显示格式为 昨天 HH:mm 例:昨天 13:12 如果 ...

  9. android 仿微信聊天界面 以及语音录制功能,Android仿微信录制语音功能

    本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下 前言 我把录音分成了两部分 1.UI界面,弹窗读秒 2.一个类(包含开始.停止.创建文件名功能) 第一部分 由于6 ...

最新文章

  1. JackJson 使用记录
  2. JFinal 源码导读第八天(1) Db.tx 事物
  3. java 类型转换的原理
  4. JS经典面试题05-变量连续声明var a = b = 1
  5. .net下模拟不同身份登陆以获取不同权限
  6. 数据算法之快速排序(quickSort)的Java实现
  7. 关于scrollTop
  8. redis java客户端封装_redis的java客户端Jedis简单封装
  9. bcdboot(引导修复工具) 命令行工具使用方法
  10. 推荐5款你用过之后不舍得卸载的小众软件
  11. 大学生创新创业大赛案例_大学生创新创业典型案例4
  12. Compose_23--动画之animateContentSize和Crossfade
  13. PS教程 | 美女面部剥落碎片效果
  14. 【算法专题】高精度之压位
  15. linux系统日志报错kernel,Linux 系统日志 kernel: __ratelimit: xxx callbacks suppressed-Fun言...
  16. 用MySQL数据库来处理中英文取首字母排序
  17. 训练SSD时,viz报错
  18. 一致性哈希算法原理详解
  19. 关于音频工作站的一些事儿
  20. 给李开复:“创新工厂”最大的问题

热门文章

  1. 如何删除.git目录
  2. echart和vue-echart的使用
  3. css渐变效果的实现
  4. 文献管理软件Zotero
  5. Java数组基础使用下标、遍历、存取与本质
  6. IDEA在同一工作空间,显示多个项目
  7. vue 实现一个滑块拖动验证功能
  8. ON DUPLICATE key update的介绍与使用
  9. NSA泄密事件之SMB系列远程命令执行漏洞及Doublepulsar后门全球数据分析
  10. 得数据者得天下!作为后端开发必备技能之一的MySQL,这份十多年经验总结的应用实战与性能调优我想你肯定是需要的!