机器人聊天的小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),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
随机推荐
- Java 8新特性-1 函数式接口
Java 8 引入的一个核心概念是函数式接口(Functional Interfaces). 通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行. 如果一个接口定义个唯一一个抽象方法,那么这 ...
- MySQL学习笔记十四:优化(1)
SQL优化 1.查看各种SQL执行的频率 mysql> show status like 'Com_select';--Com_insert,Com_delete,connections(试图连 ...
- iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调
UICollectionView的布局是可以自己定义的,在这篇博客中先在上篇博客的基础上进行扩充,我们先使用UICollectionViewFlowLayout,然后好好的介绍一下UICollecti ...
- 分析MariaDB初始化脚本mysql_install_db
在初始化MySQL的过程中经常会碰到各种问题,如 FATAL ERROR: Could not find ./bin/my_print_defaults ERROR: Can't create/wri ...
- geotrellis使用(十八)导入多波段Tiff、读取多波段Tile
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 多波段数据导入 读取多波段瓦片 提取单波段 总结 一 ...
- react-native 学习之Image篇
/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...
- swift 如何实现点击view后显示灰色背景
有这样一种场景,当我们点击view的时候,需要过0.几秒显示一个灰色或者别的颜色的背景 用button来实现,只有按下去的时候才会出现,往往在快速按下,快速抬起的时候是看不出这个变化的 下边是解决方案 ...
- struts2学习笔记--使用struts2插件实现ajax处理(返回json数据)
贴一个简单的例子,通过jquery的post调用action,定义一个对象User,有name和age属性,实例化几个对象,以json的格式返回到jsp,在前台页面显示出来,模拟用户列表. 导入相关j ...
- C# 操作数据库表和数据库
<1>c#创建数据库表: private void CreatTable(string name) //创建数据库源数据表,name为表名 { con.ConnectionStr ...
- 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了
写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...