机器人聊天的小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),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
随机推荐
- TSQL语句
1.创建数据库create database test3;2.删除数据库drop database test3;3.创建表create table test( code varchar(20), ...
- angularjs 请求后端接口请求了两次
用angularjs的过程中发现,每次打开页面,请求后端的接口都请求了两次 如下图可以看到, http://192.168.1.109:8080/zdh/api/v1/goods/54 这个页面loa ...
- 记录下帮助一位网友解决的关于android子控件的onTouch或onClick和父OnTouch 冲突的问题。
前三天收到位网友的私信求助,问题大概如标题所示.具体是下面的情况,个人感觉,这个问题挺有趣,也会在实际项目开发中很常见.不想看前奏的请直接跳至解决方法. 问题原型: 父控件是自定义的 LinearLa ...
- 关于java连接mysql数据库的几个问题的解决方法。
今天就为了连接下数据库获取信息来提供给ListView使用,搞了足足5小时. 出现的问题有: 第一个是,DriverManager.getConnection(url, user, pwd),这个函数 ...
- JavaScript中Promises/A+规范的实现
Promises是一种异步编程模型,通过一组API来规范化异步操作,这样也能够让异步操作的流程控制更加容易. 下面的代码是假设执行一个异步队列,每一项都会使用上一项返回的数据: function ne ...
- linux源码分析(四)-start_kernel-cgroup
前置:这里使用的linux版本是4.8,x86体系. cgroup_init_early(); 聊这个函数就需要先了解cgroup. cgroup概念 这个函数就是初始化cgroup所需要的参数的.c ...
- C#代码精确到毫秒时间戳写法
TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); ts.TotalMilliseconds;
- Git合并分支操作
1. 添加自己的文件 git add .; 2. 缓存自己的文件 git stash; 3. 查看状态 git status; 4. 获取别的分支 git pull origin master(分支名 ...
- Spring.Net简单用法
Spring.Net其实就是抽象工厂,只不过更加灵活强大,性能上并没有明显的区别. 它帮我们实现了控制反转. 其有两种依赖注入方式. 第一:属性注入 第二:构造函数注入 首先,我们去 Spring. ...
- Guava学习-目录
备份一下地址: 目录 1. 基本工具 [Basic utilities] 让使用Java语言变得更舒适 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服. ...