Android adapter设计模式三:聊天界面

原创 2016年06月01日 15:39:44

1.效果图:
这里写图片描述

2.说明:
getViewTypeCount返回的就是种类数目了;
getItemViewType根据当然Item的position决定返回不同的整型变量。然后在getView中,根据消息的类型去加载不同的Item布局即可。

3.源码:

package com.example.android_robot_01;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.android_robot_01.bean.ChatMessage;
import com.example.android_robot_01.bean.ChatMessage.Type;

public class ChatMessageAdapter extends BaseAdapter
{
    private LayoutInflater mInflater;
    private List<ChatMessage> mDatas;

    public ChatMessageAdapter(Context context, List<ChatMessage> datas)
    {
        mInflater = LayoutInflater.from(context);
        mDatas = datas;
    }

    @Override
    public int getCount()
    {
        return mDatas.size();
    }

    @Override
    public Object getItem(int position)
    {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    /**
     * 接受到消息为1,发送消息为0
     */
    @Override
    public int getItemViewType(int position)
    {
        ChatMessage msg = mDatas.get(position);
        return msg.getType() == Type.INPUT ? 1 : 0;
    }

    @Override
    public int getViewTypeCount()
    {
        return 2;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ChatMessage chatMessage = mDatas.get(position);

        ViewHolder viewHolder = null;

        if (convertView == null)
        {
            viewHolder = new ViewHolder();
            if (chatMessage.getType() == Type.INPUT)
            {
                convertView = mInflater.inflate(R.layout.main_chat_from_msg,
                        parent, false);
                viewHolder.createDate = (TextView) convertView
                        .findViewById(R.id.chat_from_createDate);
                viewHolder.content = (TextView) convertView
                        .findViewById(R.id.chat_from_content);
                convertView.setTag(viewHolder);
            } else
            {
                convertView = mInflater.inflate(R.layout.main_chat_send_msg,
                        null);

                viewHolder.createDate = (TextView) convertView
                        .findViewById(R.id.chat_send_createDate);
                viewHolder.content = (TextView) convertView
                        .findViewById(R.id.chat_send_content);
                convertView.setTag(viewHolder);
            }

        } else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.content.setText(chatMessage.getMsg());
        viewHolder.createDate.setText(chatMessage.getDateStr());

        return convertView;
    }

    private class ViewHolder
    {
        public TextView createDate;
        public TextView name;
        public TextView content;
    }

}

4、相关实体类:

package com.example.android_robot_01.bean;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ChatMessage
{

    /**
     * 消息类型
     */
    private Type type ;
    /**
     * 消息内容
     */
    private String msg;
    /**
     * 日期
     */
    private Date date;
    /**
     * 日期的字符串格式
     */
    private String dateStr;
    /**
     * 发送人
     */
    private String name;

    public enum Type
    {
        INPUT, OUTPUT
    }

    public ChatMessage()
    {
    }

    public ChatMessage(Type type, String msg)
    {
        super();
        this.type = type;
        this.msg = msg;
        setDate(new Date());
    }

    public String getDateStr()
    {
        return dateStr;
    }

    public Date getDate()
    {
        return date;
    }

    public void setDate(Date date)
    {
        this.date = date;
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        this.dateStr = df.format(date);

    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public Type getType()
    {
        return type;
    }

    public void setType(Type type)
    {
        this.type = type;
    }

    public String getMsg()
    {
        return msg;
    }

    public void setMsg(String msg)
    {
        this.msg = msg;
    }

}

5、布局文件
主界面消息的显示是一个ListView,不过这个listView中的Item有两种风格,一个是左边的绿色消息,一个是右边的白色消息
左边的消息布局文件:

<?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="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/chat_from_createDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2012-09-01 18:30:20"
        style="@style/chat_date_style"
       />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:orientation="vertical" >

            <ImageView
                android:id="@+id/chat_from_icon"
                android:layout_width="49dp"
                android:layout_height="49dp"
                android:src="@drawable/icon" />

            <TextView
                android:id="@+id/chat_from_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="小貅貅"
                android:textSize="18sp" />
        </LinearLayout>

        <TextView 
            android:id="@+id/chat_from_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:minHeight="50dp"
            android:background="@drawable/chat_from_msg"
            android:text="有大吗。。。"
            android:textSize="18sp"
            android:textColor="#000"
            android:gravity="center_vertical"
            android:focusable="true"
            android:clickable="true"
            android:lineSpacingExtra="2dp"
            />
    </LinearLayout>

</LinearLayout>

右边的和左边基本一致,就不贴了,最后会给出代码。

源码下载:
链接:http://pan.baidu.com/s/1pLAbNtx 密码:wr8w

———————————————————————
有需求者请加qq:136137465,非诚勿扰
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android:制作漂亮的菜单

主菜单包括File、Edit和Help三个菜单项。File菜单有New、Open和Save子菜单项;Edit菜单有Cut、Copy和Paste子菜单项;Help菜单有About和Exit子菜单项。其中...

Android开发总结笔记 GirdLayout(网格布局) 1-1-5

GridLayout的继承结构 网格布局是andorid4.0后才出来的一个布局管理器,不过现在v7包里面有兼容的 网格布局可以指定行数和列数 下面来试...

Android adapter设计模式一 静态设值

1、创建实体类:/** * @描述 TODO * @项目名称 App_imooc * @包名 com.android.imooc.quickIndex * @类名 Person * @aut...
  • lovoo
  • lovoo
  • 2016年05月24日 22:38
  • 292

android adapter

  • 2015年06月12日 12:26
  • 348KB
  • 下载

Android当中的设计模式适配器Adapter

适配器模式 Adapter(别名Wrapper)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容的类可以合作无间。 要点: 1. 适配器模式主要应用于“希望复用一些现...
  • rually
  • rually
  • 2015年04月02日 20:50
  • 1038

android adapter详解

  • 2015年01月14日 13:33
  • 20KB
  • 下载

Android Adapter的使用

  • 2015年10月26日 10:31
  • 3.66MB
  • 下载

封装使用ViewHolder模式的Adapter组件,及用其快速实现聊天界面

大家都对viewholder模式并不陌生吧,避免了重复调用findViewbyId,并对convertview进行重用。但是,开发中可能会有这样的困扰,每次在创建Adapter类时,总会有许多的重复代...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android adapter设计模式三:聊天界面
举报原因:
原因补充:

(最多只允许输入30个字)