聊天ListView
我们知道,在微信或者QQ聊天的时候,会出现至少两种布局,即收到的消息和自己发送的消息,这种效果可以用listView来实现。类似于下面这样的界面。
主要在Adapter的getView()里面下笔。
package com.example.chatting.chatting.adapter; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import com.example.chatting.chatting.R;
import com.example.chatting.chatting.bean.Chat; import org.w3c.dom.Text; import java.util.List; /**
* Created by Administrator on 2017/11/9.
*/
public class ChattingAdapter extends BaseAdapter{ private List<Chat> list;
private LayoutInflater inflater;
private Context mContext;
// private Drawable mDefaultHeadImage; public ChattingAdapter(List<Chat> list, Context context){
this.list = list;
inflater = LayoutInflater.from(context);
mContext = context;
// mDefaultHeadImage = mContext.getResources().getDrawable(R.drawable.image_head);
} @Override
public int getCount() {
return list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
} //一定得重写该方法,否则只会出现一种布局
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
Chat chat = (Chat) getItem(position);
int type = getItemViewType(position);
ViewHolder viewHolder;
if(convertView == null){
if(type == 0) { // 我说的消息
System.out.println("****type0");
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_chat_out, null);
viewHolder.tvName = (TextView)convertView.findViewById(R.id.tv_name_out);
viewHolder.tvMsg = (TextView)convertView.findViewById(R.id.tv_msg_out);
viewHolder.headImage = (ImageView)convertView.findViewById(R.id.image_head_out);
}else{
System.out.println("****type1");
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_chat_in, null);
viewHolder.tvName = (TextView)convertView.findViewById(R.id.tv_name_in);
viewHolder.tvMsg = (TextView)convertView.findViewById(R.id.tv_msg_in);
viewHolder.headImage = (ImageView)convertView.findViewById(R.id.image_head_in);
}
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
} viewHolder.tvName.setText(chat.getNickName());
viewHolder.tvMsg.setText(chat.getMessage()); return convertView;
} private class ViewHolder{
public TextView tvName, tvMsg;
public ImageView headImage;
} }
通过
@Override
public int getItemViewType(int position) {
return list.get(position).getType();
} 来决定实例化哪个布局, 通过
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
来决定布局的类型个数。 chat为封装聊天内容的java类:
package com.example.chatting.chatting.bean; import java.io.Serializable; /**
* Created by Administrator on 2017/11/9.
*/
public class Chat implements Serializable{
private String message;
private int type;
private String NickName;
private String imgURL; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public int getType() {
return type;
} public void setType(int type) {
this.type = type;
} public String getNickName() {
return NickName;
} public void setNickName(String nickName) {
NickName = nickName;
} public String getImgURL() {
return imgURL;
} public void setImgURL(String imgURL) {
this.imgURL = imgURL;
}
}
接下来是两个布局的代码:
1、
list_chat_out:发送消息的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="80dp" > <ImageView
android:id="@+id/image_head_out"
android:layout_width="45dp"
android:layout_height="45dp"
android:src="@mipmap/me_press"
android:layout_alignParentRight="true"/> <TextView
android:id="@+id/tv_name_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/image_head_out"
android:layout_alignTop="@id/image_head_out"
android:layout_marginRight="5dp"
android:textColor="@color/colorTheme"
android:textSize="14sp"
android:text="name"/> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="40dp"
android:layout_toLeftOf="@id/image_head_out"
android:layout_below="@id/tv_name_out"
android:layout_marginRight="10dp"
android:background="@color/colorTheme"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_msg_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:textColor="@color/colorBlack"
android:textSize="18sp"
android:text="content"/>
</LinearLayout> </RelativeLayout>
2、list_chat_in:接收消息的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="80dp" > <ImageView
android:id="@+id/image_head_in"
android:layout_width="45dp"
android:layout_height="45dp"
android:src="@mipmap/me_press"
/> <TextView
android:id="@+id/tv_name_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image_head_in"
android:layout_alignTop="@id/image_head_in"
android:layout_marginLeft="5dp"
android:textColor="@color/colorTheme"
android:textSize="14sp"
android:text="name"/> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="40dp"
android:layout_toRightOf="@id/image_head_in"
android:layout_below="@id/tv_name_in"
android:layout_marginLeft="10dp"
android:background="@color/colorGray"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_msg_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:layout_marginLeft="15dp"
android:textColor="@color/colorBlack"
android:textSize="18sp"
android:text="content"/>
</LinearLayout> </RelativeLayout>
聊天ListView的更多相关文章
- Android群英传笔记——第四章:ListView使用技巧
Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...
- Android群英传知识点回顾——第四章:ListView常用优化技巧
4.1 ListView常用优化技巧 4.1.1 使用ViewHolder模式提高效率 4.1.2 设置项目间分割线 4.1.3 隐藏ListView的滚动条 4.1.4 取消ListView的Ite ...
- Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!
Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...
- 自定义一个ListView实现聊天界面
摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...
- ListView数据更新后,自动滚动到底部(聊天时常用)| Listview Scroll to the end of the list after updating the list
转:http://www.cnblogs.com/bjshsqlt/p/3311830.html If you would like to after you have updated by list ...
- ListView:聊天界面
一.最终成型图 二.主界面xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- Android—简单的仿QQ聊天界面
最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,):
- xamarin android ListView手动分组
xamarin的listview控件其实自带有分组方法,关于xamarin listview的自带分组方法请自行参考官方文档,我这里只写自己写的分组方法.xamarin自带的分组好是好,功能多,但是加 ...
- xamarin优化listView.ScrollTo
在xamarinz中关于listview的滚动,我这里有点小优化,我做了一个类似QQ的聊天页面,上面是一个listview,下面时一个editText,当在手机上使用时,发现在android平台下,如 ...
随机推荐
- 【ABP框架系列学习】模块系统(4)之插件示例开发
0.引言 上一篇博文主要介绍了ABP模块及插件的相关知识,本章节主要开发一个插件示例来学习如何创建一个插件,并在应用程序中使用.这个命名为FirstABPPlugin的插件主要在指定的时间段内删除审计 ...
- 【shiro】(2)---基于RUL的权限管理
基于RUL的权限管理 我想在写shiro权限管理认证前,先来一个基于URL实现的权限管理控制. 一.基于URI的权限业务逻辑 实现思路: 将系统操作的每个url配置在权限表中,将权限对应 ...
- new Date()浏览器兼容性问题
不同浏览器有不同的差异,一般时间格式是“2018-11-13”,这种格式在Chrome下是可以正常执行的,不过在ie浏览器里面 就会变成NaN 解决方法:将时间转换成“2018/11/13” 这种格式 ...
- iOS逆向开发(1):基础工具 | ssh | scp | socat
小白:小程,我一直想问,什么是逆向来着?是逆向行驶吗? 小程:理解为逆向行驶也没错.一般的项目是从无到有,而逆向是从已有的状态入手,分析出已有的流程与结构的手段. iOS上的逆向开发,是一件有趣的事情 ...
- 【原创】Git删除暂存区或版本库中的文件
0 基础 我们知道Git有三大区(工作区.暂存区.版本库)以及几个状态(untracked.unstaged.uncommited),下面只是简述下Git的大概工作流程,详细的可以参见本博客的 ...
- Python从入门到精通系列文章总目录
Python最新全套课程(8月中旬开的课),共四个月.所有课件,项目源码,课后习题和答案都包括在内. 包括:Python实战项目引入.Python基础.爬虫基础.爬虫库.Scrapy爬虫框架.动态页面 ...
- PHP中的__call和__callStatic方法
如何防止调用不存在的方法而出错,使用__call魔术重载方法. __call方法原型如下: mixed __call(string $name,array $arguments) 当调用一个不可访问的 ...
- Java 趣史-差点把 Java 命名成了 Silk(丝绸)
差点把 Java 命名成了 Silk(丝绸) Java 命名的由来 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆). ...
- 以 SPI 方式获取 SD 卡容量(V2.0)
下面是 SD 卡 V2.0 协议的 CSD 寄存器内容,来自官方手册: 单片机如何确定当前的 SD 卡遵循 V2.0 协议 CSD 寄存器为 128 个位,即 16 个字节.通过检测 CSD 寄存器的 ...
- spark高可用集群搭建及运行测试
文中的所有操作都是在之前的文章spark集群的搭建基础上建立的,重复操作已经简写: 之前的配置中使用了master01.slave01.slave02.slave03: 本篇文章还要添加master0 ...