先来张图,看看我们要做成什么样的效果。很简单的一个发送消息接收消息的界面,那怎么实现的呢,毫无疑问,是ListView的多布局了,右边显示我们发送消息的条目,左边显示要接收消息的条目。下面是一个EditText+Button。代码如下(多加一句,ListView多布局type一定是从0开始,不是从0开始的要转换成从0开始)

receive_message_item.xml-----接收消息布局
<?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="match_parent">
<ImageView
android:id="@+id/iv_receive_message"
android:src="@mipmap/meinv"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/tv_receive_message"
android:text="send message"
android:textColor="#08e735"
android:layout_marginLeft="10dp"
android:background="#07b3ec"
android:layout_marginRight="30dp"
android:gravity="center_vertical"
android:layout_marginTop="20dp"
android:layout_toRightOf="@+id/iv_receive_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </RelativeLayout>
send_message_item.xml---发送消息布局
<?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="match_parent">
<TextView
android:id="@+id/tv_send_message"
android:text="send message"
android:background="#07b3ec"
android:layout_marginLeft="30dp"
android:textColor="#df1515"
android:gravity="center_vertical"
android:layout_toLeftOf="@+id/iv_send_message"
android:layout_width="wrap_content"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv_send_message"
android:src="@mipmap/man"
android:layout_alignParentRight="true"
android:layout_width="50dp"
android:layout_height="50dp" />
</RelativeLayout>
activity_main.xml----LietView布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#16d4a5"
tools:context="com.zcl.tuling.MainActivity"> <ListView
android:id="@+id/lv_message"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:dividerHeight="10dp"
android:divider="@null"
android:layout_weight="1" /> <FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<EditText
android:id="@+id/edt_send_message"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="请输入要发送的消息" />
<Button
android:id="@+id/btn_send"
android:layout_width="80dp"
android:layout_height="50dp"
android:text="发送" /> </LinearLayout>
</FrameLayout>
</LinearLayout>

实体类:

public class TuLingBean {
private int code;
private String text; public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} public String getText() {
return text;
} public void setText(String text) {
this.text = text;
}
}

MainActivity.java-----说明一下,这里网络请求数据我为了节省时间我用的是自己封装的一个库,之后有时间会改过来的。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final String URL_PATH="http://www.tuling123.com/openapi/api?key=dae83a55d5c542d4946958ad613b8d7c&info=";
private static final String TAG = MainActivity.class.getSimpleName();
private ListView mListView;
private EditText mEditText;
private Button mButton;
private MessageAdapter adapter;
private String text;
private List<TuLingBean> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mList=new ArrayList<>();
mListView = (ListView) findViewById(R.id.lv_message);
mEditText = (EditText) findViewById(R.id.edt_send_message);
mButton = (Button) findViewById(R.id.btn_send);
mButton.setOnClickListener(this);
adapter = new MessageAdapter(this, mList);
mListView.setAdapter(adapter);
}
private void setData() {
HttpUtil.getStringAsync(URL_PATH + text, new HttpUtil.RequestCallBack() {
@Override
public void onFailure() {
Log.i(TAG, "onFailure: ");
}
@Override
public void onSuccess(String result) {
Log.i(TAG, "onSuccess: ");
Gson gson = new Gson();
TuLingBean fromJson = gson.fromJson(result, TuLingBean.class);
mList.add(fromJson);
adapter.notifyDataSetChanged();
mEditText.setText("");
}
@Override
public void onFinish() {
Log.i(TAG, "onFinish: "); }
});
mListView.setSelection(mList.size());
} @Override
public void onClick(View v) {
text=mEditText.getText().toString().trim();
TuLingBean bean=new TuLingBean();
bean.setText(text);
bean.setCode(1);
mList.add(bean);
adapter.notifyDataSetChanged();
setData();
}
}

适配器

public class MessageAdapter extends BaseAdapter {
private List<TuLingBean> data;
private LayoutInflater inflater; public MessageAdapter(Context context, List<TuLingBean> data) {
this.data = data;
inflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return data != null ? data.size() : 0;
} @Override
public TuLingBean getItem(int position) {
return data.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public int getItemViewType(int position) {
int type=0;
if (data.get(position).getCode()==100000){
return type;
}
return data.get(position).getCode();
} @Override
public int getViewTypeCount() {
return 2;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolder holder = null;
ViewHolderLeft holderLeft = null;
if (convertView == null) {
switch (type) {
case 0:
holderLeft = new ViewHolderLeft();
convertView = inflater.inflate(R.layout.receive_message_item, parent, false);
holderLeft.receiveMessage = (TextView) convertView.findViewById(R.id.tv_receive_message);
holderLeft.receiveMessage.setText(data.get(position).getText());
convertView.setTag(holderLeft);
break; case 1:
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.send_message_item, parent, false);
holder.sendMessage = (TextView) convertView.findViewById(R.id.tv_send_message);
holder.sendMessage.setText(data.get(position).getText());
convertView.setTag(holder);
break;
}
} else {
switch (type) {
case 0:
holderLeft = (ViewHolderLeft) convertView.getTag();
holderLeft.receiveMessage.setText(data.get(position).getText());
break;
case 1:
holder = (ViewHolder) convertView.getTag();
holder.sendMessage.setText(data.get(position).getText());
break;
}
}
return convertView;
}
public class ViewHolder {
TextView sendMessage;
}
public class ViewHolderLeft {
TextView receiveMessage;
} }

机器人聊天的小Demo的更多相关文章

  1. Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天

    前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...

  2. 微信小程序--聊天室小程序(云开发)

    微信小程序 -- 聊天室小程序(云开发) 从微信小程序开发社区更新watch接口之后,一直在构思这个项目.项目已经完成很久,但是一直都没有空写一篇博客记录展示一下. 开源地址 wx-cloud-im: ...

  3. 新手 gulp+ seajs 小demo

    首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...

  4. Nancy之基于Nancy.Hosting.Self的小Demo

    继昨天的Nancy之基于Nancy.Hosting.Aspnet的小Demo后, 今天来做个基于Nancy.Hosting.Self的小Demo. 关于Self Hosting Nancy,官方文档的 ...

  5. Nancy之基于Nancy.Owin的小Demo

    前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...

  6. Nancy之基于Self Hosting的补充小Demo

    前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...

  7. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  8. Java接入图灵机器人,实现与机器人聊天

    很多人都玩过微信,其中就有与机器人聊天的功能:

  9. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

随机推荐

  1. ASP.NET MVC之如何看待内置配置来提高性能优化(四)

    前言 前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法. Razor视图引擎优化(优化一) 我们知道默认情况下配置MVC去解析一个视图会首先约定通过查 ...

  2. MongoDB学习系列(1)--入门介绍

    MongoDB是一款为Web应用程序设计的面向文档结构的数据库系统. MongoDB贡献者是10gen公司.地址:http://www.10gen.com 1.MongoDB主要特性: 1.1文档数据 ...

  3. ASP.NET:注销功能实现

    原理:清空Session 1.Web窗体:index.aspx <a href="logoutHandler.ashx">注销</a> 2.一般处理程序:L ...

  4. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  5. HTML5 视频(二) <video> 使用 DOM 进行控制

    HTML5 <video> 使用 DOM 进行控制 一.HTML5 <video> 元素同样拥有方法.属性和事件. 其中的方法用于播放.暂停以及加载等.其中的属性(比如时长.音 ...

  6. css常用的特效代码

    一.网页变灰的代码:a) 网页变灰色<head>加到这里</head><style type="text/css">html {FILTER: ...

  7. CSS-清除浮动

    什么是CSS清除浮动? 在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高 ...

  8. 关于log4net日志的配置流程

    最近又重新整理一下log4net日志的配置,现在记录一下流程和一些遇到的问题,以备后续使用,具体的配置参数等信息.此文无,见谅! 1. 下载log4net.dll文件(网上很多,随便找一个!) 2. ...

  9. iOS阶段学习第32天笔记(页面传值方法介绍)

    iOS学习(UI)知识点整理 一.界面传值方法 1.方法一  Block传值  通过SubView视图的Block向View视图传值改变View视图的背景色 实例代码: 1)SubViewContro ...

  10. [译]Godot系列教程一 - 场景与节点

    场景(Scene)与节点(Node) 简介 先设想有那么一瞬间你自己不再是一名游戏开发者了,而是一名大厨! 你的装备换成了一套大厨的制服.不要考虑制作游戏的事情,你现在的职责是为你的顾客创建新的可口的 ...