ListView:聊天界面
一.最终成型图
二.主界面xml布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:layout_width="match_parent" android:layout_height="0dp" android:id="@+id/msgList" android:layout_weight="1" android:divider="#0000" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:id="@+id/send_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:maxLines="2" android:hint="请输入内容"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送" android:id="@+id/send" android:onClick="btnClick" /> </LinearLayout> </LinearLayout>
三.Msg类:
public class Msg { public static final int TYPE_RECEIVED = 0; public static final int TYPE_SEND = 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 子项的布局,msg_item.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="15dp"> <LinearLayout android:id="@+id/left_layout" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="left" android:background="@drawable/left"> <TextView android:id="@+id/left_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp"/> </LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="right" android:background="@drawable/right"> <TextView android:id="@+id/right_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:textColor="#000000"/> </LinearLayout> </LinearLayout>
五.ListView 的适配器类,让它继承自ArrayAdapter,并将泛型指定为Msg 类。新建类MsgAdapter,代码如下:
public class MsgAdapter extends ArrayAdapter<Msg> { private int resourceId; public MsgAdapter(Context context, int resource, List<Msg> objects) { super(context, resource, objects); resourceId = resource; } @NonNull @Override public View getView(int position, View convertView, ViewGroup parent) { View view; Msg msg = getItem(position); ViewHolder viewHolder; if( convertView == null ){ view = LayoutInflater.from(getContext()).inflate(resourceId,null); viewHolder = new ViewHolder(); viewHolder.left_layout = (LinearLayout)view.findViewById(R.id.left_layout); viewHolder.right_layout = (LinearLayout)view.findViewById(R.id.right_layout); viewHolder.left_msg = (TextView)view.findViewById(R.id.left_msg); viewHolder.right_msg = (TextView)view.findViewById(R.id.right_msg); view.setTag(viewHolder); }else{ view = convertView; viewHolder = (ViewHolder)view.getTag(); } if( msg.getType() == Msg.TYPE_RECEIVED ){ viewHolder.left_layout.setVisibility(View.VISIBLE); viewHolder.right_layout.setVisibility(View.GONE); viewHolder.left_msg.setText(msg.getContent()); }else{ viewHolder.left_layout.setVisibility(View.GONE); viewHolder.right_layout.setVisibility(View.VISIBLE); viewHolder.right_msg.setText(msg.getContent()); } return view; } class ViewHolder{ LinearLayout left_layout; LinearLayout right_layout; TextView left_msg; TextView right_msg; }; }
六.修改MainActivity 中的代码,来为ListView 初始化一些数据,并给发送按钮加入事件响应
public class MainActivity extends Activity { private List<Msg> msgList = new ArrayList<Msg>(); private MsgAdapter msgAdapter; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initList(); listView = (ListView)findViewById(R.id.msgList); msgAdapter = new MsgAdapter(MainActivity.this, R.layout.msg_item, msgList); listView.setAdapter(msgAdapter); } protected void btnClick(View view){ if( view.getId() == R.id.send ){ EditText send_msg = (EditText)findViewById(R.id.send_msg); String message = send_msg.getText().toString().trim(); if( message.length() >0 ){ Msg msg = new Msg(message, Msg.TYPE_SEND); msgList.add(msg); msgAdapter.notifyDataSetChanged(); listView.setSelection(msgList.size()); send_msg.setText(""); } } } private void initList(){ Msg msg; msg = new Msg("你好啊,朋友", 0); msgList.add(msg); msg = new Msg("我很好", 1); msgList.add(msg); msg = new Msg("what are you doing?", 0); msgList.add(msg); } }
ListView:聊天界面的更多相关文章
- 自定义一个ListView实现聊天界面
摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...
- Android—简单的仿QQ聊天界面
最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,):
- Android学习笔记(十二)——实战:制作一个聊天界面
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...
- 自定义android精美聊天界面
编写精美聊天界面,那就肯定要有收到的消息和发送的消息. 首先还是编写主界面,修改activity_chat.xml中的代码,如下所示: <?xml version="1.0" ...
- 高仿qq聊天界面
高仿qq聊天界面,给有需要的人,界面效果如下: 真心觉得做界面非常痛苦,给有需要的朋友. chat.xml <?xml version="1.0" encoding=&quo ...
- Android开发学习之路--UI之简单聊天界面
学了很多的ui的知识,这里就来实现个聊天的界面,首先来实现个layout的xml,代码如下: <?xml version="1.0" encoding="utf-8 ...
- RecyclerView 作为聊天界面,被键盘遮挡的解决办法
最近项目在重构,使用 RecyclerView 替换了 ListView 作为 IM 的聊天界面.然后遇到了一个问题就是当键盘弹出来的时候,键盘会遮挡住 RecyclerView 的一部分,造成聊天内 ...
- RV 多样式 MultiType 聊天界面 消息类型 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- android 仿微信聊天界面,以及语音录制功能
extends:http://104zz.iteye.com/blog/1709840 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 ...
随机推荐
- js date扩展方法
/* File Created: 四月 28, 2015 */ //日期加上天数得到新的日期 //dateTemp 需要参加计算的日期,days要添加的天数,返回新的日期,日期格式:YYYY-MM-D ...
- SQL 整理
批量插入 insert into table select ... union all select... insert into table (...) values (...) , (...) i ...
- git 之gitignore 添加项之后生效的问题
.gitjignore 文件是在团队项目中上传到云端的的规则文件,主要是写些规则过滤掉某些文件夹或者文件 一,过滤规则 由于我用webstrom 通常会生成一些日志文件 /.idea/ 过滤整个文 ...
- OpenGL入门学习(五)
http://developer.178.com/201103/94955548786.html 今天要讲的是三维变换的内容,课程比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后 ...
- 嵌入式Linux上通过boa服务器实现cgi/html的web上网【转】
转自:http://blog.csdn.net/tianmohust/article/details/6595996 版权声明:本文为博主原创文章,未经博主允许不得转载. 嵌入式Linux上通过boa ...
- VS2013 更改MFC标题栏图标和生成的执行文件图标
创建一个新工程,可以什么都不加.打开.rc, 创建或打开Icon资源(以下都以Icon为例). 单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delet ...
- Centos 多线程下载工具-axel
32位CentOS执行下面命令: wget -c http://pkgs.repoforge.org/axel/axel-2.4-1.el5.rf.i386.rpm rpm -ivh axel-2.4 ...
- 安卓SDK安装时出现的小问题
在SDK Manager启动安装后出现网页不能访问的错误 错误日志如下 Fetching URL: https://dl-ssl.google.com/android/repository/repos ...
- R 语言词云wordcloud
来源:http://blog.chinaunix.net/uid-25135004-id-4311592.html wordcloud函数--用于绘制词云图 用法: wordcloud(words,f ...
- webpack2.x基础属性讲解
webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x ...