聊天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平台下,如 ...
随机推荐
- MySql事务的隔离级别及作用
逻辑工作单元遵循一系列(ACID)规则则称为事务. 原子性:保证事务是一系列的运作,如果中间过程有一个不成功则全部回滚,全部成功则成功.保证了事务的原则性. 一致性:一致性指的是比如A向B转100块钱 ...
- CoCos2dx开发:中文乱码
一.FontToUTF8()方法修改字体: 1.HelloWorldScene.h头文件中声明方法: char* FontToUTF8(const char* font); 2.HelloWorldS ...
- Python代码规范之---代码不规范,亲人两行泪
任何语言的程序员,编写出符合规范的代码,是开始程序生涯的第一步! 关于代码规范 Python 官方提供有一系列 PEP(Python Enhancement Proposals) 文档 其中第 8 篇 ...
- vue 移动端屏幕适配 使用rem
要想移动端适配 并使用 rem 您需要先看这篇文章,配置好less ➡️ 在vue 中使用 less,就可以使用rem了 如果项目已经开发的差不多了,没有用到rem 又要使用rem,您用这招. po ...
- mysql 架构篇系列 3 复制运行状态监控与选项参数说明
一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...
- 剑指offer-学习笔记
前言:18/06/06开始学习,每个程序都会用C写一遍,因书中用C++举例,也会换种思路写,供学习和参考!!!很推荐这本书很不错,准备入手,一般不买实体书,都用电子书,因一般都看一遍,但这本会看很多遍 ...
- [NewLife.XCode]数据层缓存(网站性能翻10倍)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...
- Apache Flink 漫谈系列 - JOIN 算子
聊什么 在<Apache Flink 漫谈系列 - SQL概览>中我们介绍了JOIN算子的语义和基本的使用方式,介绍过程中大家发现Apache Flink在语法语义上是遵循ANSI-SQL ...
- 痞子衡嵌入式:恩智浦LPC系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦LPC系列微控制器相关知识. 恩智浦半导体最早于2003年便开始推出LPC系列MCU,但早期的产品LPC2000/3000系列属 ...
- .Net NPOI 根据excel模板导出excel、直接生成excel
一.根据Excel模板导出excel 1.导入NPOI.dll 2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...