先来张图,看看我们要做成什么样的效果。很简单的一个发送消息接收消息的界面,那怎么实现的呢,毫无疑问,是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. IOS数据存储之NSUserDefaults

    前言: 作为从事Android开发人来说一定听说过SharedPreferences,然后要成为一名ios开发工程师来说咋能不知道NSUserDefaults!接下来让我们认识一下. NSUserDe ...

  2. Web APi之手动实现JSONP或安装配置Cors跨域(七)

    前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...

  3. ES6 - Note4:Class类

    1.Class类的介绍 在ES6中新增了Class类的概念,让语法看起来更像是面向对象编程,其实这可以说是一个语法糖,ES5可以做到Class绝大部分功能,但也有一些不同.在ES6以前,可以通过构造函 ...

  4. 教你如何塑造JavaScript牛逼形象

    如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?下面列出一些在JavaScrip ...

  5. 纪念我曾经的 JAVA 姿势--转

    原文地址:https://segmentfault.com/a/1190000007122432?hmsr=toutiao.io&utm_medium=toutiao.io&utm_s ...

  6. 关于在用curl函数post网页数据时,遇上表单提交 type为submit 类型而且没有name和id时可能遇到的问题及其解决方法

    curl函数库实现爬网页内容的链接在 http://www.cnblogs.com/linguanh/p/4292316.html 下面这个是没有name和id 标识的 <input type= ...

  7. swift 如何实现点击view后显示灰色背景

    有这样一种场景,当我们点击view的时候,需要过0.几秒显示一个灰色或者别的颜色的背景 用button来实现,只有按下去的时候才会出现,往往在快速按下,快速抬起的时候是看不出这个变化的 下边是解决方案 ...

  8. 解决CHROME中画布中无法显示图片的方法

    最终效果图如下 我按照W3SCHOOL里面的方法,代码如下 <!DOCTYPE html> <html> <body> <script type=" ...

  9. 【集合框架】JDK1.8源码分析之ArrayList(六)

    一.前言 分析了Map中主要的类之后,下面我们来分析Collection下面几种常见的类,如ArrayList.LinkedList.HashSet.TreeSet等.下面通过JDK源码来一起分析Ar ...

  10. ThinkPHP中的快捷函数小结

    U() 制作url地址的快捷函数 C(名称) 获得配置变量(convertion.php config.php)信息C(名称,值) 设置配置变量信息 L() 获得语言变量信息E() 给页面输出错误信息 ...