机器人聊天的小Demo
先来张图,看看我们要做成什么样的效果。很简单的一个发送消息接收消息的界面,那怎么实现的呢,毫无疑问,是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的更多相关文章
- Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天
前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...
- 微信小程序--聊天室小程序(云开发)
微信小程序 -- 聊天室小程序(云开发) 从微信小程序开发社区更新watch接口之后,一直在构思这个项目.项目已经完成很久,但是一直都没有空写一篇博客记录展示一下. 开源地址 wx-cloud-im: ...
- 新手 gulp+ seajs 小demo
首先,不说废话,它的介绍和作者就不在多说了,网上一百度一大堆: 我在这里只是来写写我这2天抽空对seajs的了解并爬过的坑,和实现的一个小demo(纯属为了实现,高手请绕道); 一.环境工具及安装 1 ...
- Nancy之基于Nancy.Hosting.Self的小Demo
继昨天的Nancy之基于Nancy.Hosting.Aspnet的小Demo后, 今天来做个基于Nancy.Hosting.Self的小Demo. 关于Self Hosting Nancy,官方文档的 ...
- Nancy之基于Nancy.Owin的小Demo
前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...
- Nancy之基于Self Hosting的补充小Demo
前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self H ...
- [Unity3D]做个小Demo学习Input.touches
[Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...
- Java接入图灵机器人,实现与机器人聊天
很多人都玩过微信,其中就有与机器人聊天的功能:
- Android -- 自定义View小Demo,动态画圆(一)
1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
随机推荐
- 一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化
在前面的系列文章中,我们介绍了官方有关获取数据,以及建模的原始文档和基本介绍.今天继续给大家介绍官方文档中,有关可视化的内容.实际上获获取数据和建模更注重业务关系的处理,而可视化则关注对数据的解读.这 ...
- 在.NET开发面向Oracle数据库的应用程序
其实这个不是一个什么新的话题.但是之前在多次项目中,总是遇到大家针对Oracle数据库的访问时,会有各种各样的问题,最基本的就是要在客户端安装各种client,版本不一样的话还有各种问题. 静下心来看 ...
- tomcat:there is no resources that can be added or removed from server
原因: 1.不是web project 解决方式:project-->property--project facet 新建或者修改 2. 版本不兼容 升级tomcat版本
- java 连接数据库之一个完整的函数
第一个参数要查询的列名第二个参数是连接的url第三个参数是用户名第四个参数密码第五个参数是执行的命令. 注意,url格式是 jdbc:mysql://localhost:3306/wechat jdb ...
- css截断长文本显示
实现 截断长文本显示处理,以前是通过后台的截取,但这种方法容易丢失数据,不利于SEO. 而通过前端css的截断,则灵活多变,可统一运用与整个网站. 这项技术主要运用了text-overflow属性,这 ...
- JavaMail基础案例开发
Java邮件开发案例 所需jar包有:mailapi.jar,smtp.jar 一.单独邮件发送案例 package com.itRed.javamail; import java.util.Prop ...
- effective java 读后感
think in java , effective java 这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...
- Moon.Orm 5.0 (MQL版) 实际开发实例Demo
http://www.cnblogs.com/humble/p/4593133.html (文章新地址) http://www.cnblogs.com/humble/p/4593133.html ...
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
- Nancy之基于Nancy.Owin的小Demo
前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...