我们知道,在微信或者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的更多相关文章

  1. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

  2. Android群英传知识点回顾——第四章:ListView常用优化技巧

    4.1 ListView常用优化技巧 4.1.1 使用ViewHolder模式提高效率 4.1.2 设置项目间分割线 4.1.3 隐藏ListView的滚动条 4.1.4 取消ListView的Ite ...

  3. Android群英传笔记——摘要,概述,新的出发点,温故而知新,可以为师矣!

    Android群英传笔记--摘要,概述,新的出发点,温故而知新,可以为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席 ...

  4. 自定义一个ListView实现聊天界面

    摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...

  5. 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 ...

  6. ListView:聊天界面

    一.最终成型图 二.主界面xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  7. Android—简单的仿QQ聊天界面

    最近仿照QQ聊天做了一个类似界面,先看下界面组成(画面不太美凑合凑合呗,,,,):

  8. xamarin android ListView手动分组

    xamarin的listview控件其实自带有分组方法,关于xamarin listview的自带分组方法请自行参考官方文档,我这里只写自己写的分组方法.xamarin自带的分组好是好,功能多,但是加 ...

  9. xamarin优化listView.ScrollTo

    在xamarinz中关于listview的滚动,我这里有点小优化,我做了一个类似QQ的聊天页面,上面是一个listview,下面时一个editText,当在手机上使用时,发现在android平台下,如 ...

随机推荐

  1. ubuntu16.04 下使用vscode备忘录

    微软的vscode是为程序员做了非常大贡献,其强大的功能和各个平台的可移植性给vscode带来了非常大的火力.在程序员的世界中非常的流行,算是一线明星了. 我把使用过程中遇到的一些问题做个记录,方便自 ...

  2. 如何解决git====push 过程中出现的。error: failed to push some refs

    当我们在利用git  push 文件到仓库时出现了一下问题: ! [rejected] master -> master (fetch first)error: failed to push s ...

  3. Ubuntu18.04下配置Nginx+RTMP服务器,实现点播/直播/录制功能

    2019.3.22更新 最新的nginx-1.15.9可与openssl1.1.1兼容了 以下原文: 这个东西我眼馋挺久了,最近终于试玩了一下,感觉很好玩,在搭建的过程在也遇到一些坑,这里总结一下 安 ...

  4. 一个致命的 Redis 命令,导致公司损失 400 万!!

    最近安全事故濒发啊,前几天发生了<顺丰高级运维工程师的删库事件>,今天又看到了 PHP 工程师在线执行了 Redis 危险命令导致某公司损失 400 万.. 什么样的 Redis 命令会有 ...

  5. Postgresql-模糊匹配大杀器

    # Postgresql-模糊匹配大杀器 ## 问题背景 随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser) ...

  6. 召回率,精确率,mAP如何计算

    首先用训练好的模型得到所有测试样本的confidence  score,每一类(如car)的confidence   score保存到一个文件中(如comp1_cls_test_car.txt).假设 ...

  7. 使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库

    一.背景 在平时开发过程当中需要针对 MySQL 数据库进行监控,这里我们可以使用 Grafana 和 Prometheus 来实现监控功能.Grafana 是一款功能强大的仪表盘面板,支持多种数据源 ...

  8. RabbitMQ配置

    RabbitMQ Configuration RabbitMQ提供多种配置方式:配置文件.环境变量.运行时参数等等. 默认配置文件的位置在/etc/rabbitmq/ Config File Loca ...

  9. Eclipse打包出错——提示GC overhead limit exceeded

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在Eclipse开发环境中打包发布apk安装包的时候,有时候会出现下面的错误: 原因 在打包的时候,Eclipse占用的内存会增大,当分配给Ecl ...

  10. [机器学习] --- Getting Started With MachineLearning

    一. What's machine learning Machine Learning is the science of gettingcomputers to act without being  ...