您的位置:首页 > 其它

图灵智能对话机器人DEMO

2016-10-08 14:36 405 查看
PS:

目前还有点bug,会继续修正

存在问题:当对话到达30个或以上只删除了机器人的消息。

bug已经修正

设计步骤:

1、main布局和头像+对话框布局

2、得到EditView得到用户输入的信息并通过点击发送按钮,触发onClick事件,此处分为2部分:

【1】通过HttpClient的httpGet,采用异步任务AsyncTask,并将得到的数据传回MainActivity并进行解析。

【2】数据存在lists中

3、异步任务AsyncTask如何进行:见文章链接点击打开链接

4、在ListAdapter的设置方面:

【1】首先需要通过LayoutInflater.from(mContext)先获得实例inflater,然后通过inflater.inflate()得到需要载入的界面;

【2】判断是机器人还是用户,数据显示在屏幕上。

5、数据的封装

***main.xml***
<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:paddingTop="@dimen/activity_vertical_margin"
tools:context="huaxa.it.tulingdemo.MainActivity" >

<ListView
android:divider="@null"
android:transcriptMode="alwaysScroll"
android:listSelector="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/lv"
></ListView>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@null"
android:id="@+id/edt"
/>
<Button

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt"
android:text="@string/bt"
/>
</LinearLayout>

</LinearLayout>


***left_layout.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/time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<ImageView
android:layout_below="@id/time"
android:padding="10dp"
android:background="@drawable/girl"
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/iv"/>
<TextView
android:layout_below="@id/time"
android:layout_marginRight="50dp"
android:background="@drawable/back1"
android:layout_toRightOf="@id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/tv"
android:textColor="#ff0000"
/>
</RelativeLayout>


[b]__________[/b]`[b]__________________[/b]

***right_layout.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/time"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" />
<ImageView
android:layout_below="@id/time"
android:layout_alignParentRight="true"
android:padding="10dp"
android:background="@drawable/man"
android:layout_width="70dp"
android:layout_height="70dp"
android:id="@+id/iv"/>
<TextView
android:layout_below="@id/time"
android:layout_marginLeft="50dp"
android:background="@drawable/back2"
android:layout_toLeftOf="@id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/tv"
android:textColor="#ff0000"
/>
</RelativeLayout>


***strings.xml***
<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">TulingDemo</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="first">小花来惹~这位大侠,很久不见!</string>
<string name="bt">发送</string>
<string-array name="welcome_tips">
<item>主人,奴婢在此等候多时了</item>
<item>主人,近来一切可好</item>
<item>亲爱的,我想死你了</item>
<item>欢迎归来,我亲爱的主人</item>
<item>我是小灵机器人,很高兴为您服务</item>
</string-array>
</resources>


***MainActivity.java***
package huaxa.it.tulingdemo;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.text.style.UpdateAppearance;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends Activity implements HttpGetDataListener, OnClickListener{

private List<ListData> lists;
private Button bt;
private EditText edt;
private ListView lv;
private ListAdapter listAdapter;
private String sendtext;
private double currentTime=0, oldTime = 0;
private String[] welcome_array;
private HttpData httpData;
private ListData listData;
private int flag1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){

lists = new ArrayList<ListData>();
bt = (Button) findViewById(R.id.bt);
edt= (EditText) findViewById(R.id.edt);
lv = (ListView) findViewById(R.id.lv);
listAdapter = new ListAdapter(lists,this);
bt.setOnClickListener(this);
lv.setAdapter(listAdapter);
ListData listData;
listData = new ListData(getRandomWelcomeTips(), ListData.Recevier,
getTime());
lists.add(listData);

}
private String getRandomWelcomeTips() {
String welcome_tip = null;
welcome_array = this.getResources()
.getStringArray(R.array.welcome_tips);
int index = (int) (Math.random() * (welcome_array.length - 1));
welcome_tip = welcome_array[index];
return welcome_tip;
}
@Override
public void getDataUrl(String data) {
//      System.out.println(data);
parseText(data);
}
//解析文字
public void parseText(String str){
JSONObject jsonObject;
try {
jsonObject = new JSONObject(str);
//          System.out.println(jsonObject.getString("code"));
//          System.out.println(jsonObject.getString("text"));
listData = new ListData(jsonObject.getString("text"), ListData.Recevier,
getTime());
lists.add(listData);
Log.i("receiver", lists.toString());
listAdapter.notifyDataSetChanged();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendtext = edt.getText().toString();
edt.setText("");
String dropk = sendtext.replace(" ", "");
String droph = dropk.replace("\n", "");
listData = new ListData(sendtext, ListData.Send, getTime());
li
fce6
sts.add(listData);
//      System.out.println(lists.toString());
if (lists.size() > 30) {
for (int i =lists.size()-6; i >= 0; i--) {
lists.remove(i);

}
}
Log.i("send", lists.toString());
listAdapter.notifyDataSetChanged();
httpData = (HttpData) new HttpData(
"http://www.tuling123.com/openapi/api?key=b4521b4718ed4f3fb5bddf6518b8d564&info="+droph,
this).execute();
}
private String getTime() {
currentTime = System.currentTimeMillis();
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date curDate = new Date();
String str = format.format(curDate);
if (currentTime - oldTime >= 60000) {
oldTime = currentTime;
return str;
} else {
return "";
}
}

}


——————————————————————————————

***HttpData.java***
package huaxa.it.tulingdemo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

public class HttpData extends AsyncTask<String, Void, String>{

private HttpClient mHttpClient;
private  HttpGet httpGet;
private HttpResponse mHttpResponse;
private HttpEntity mHttpEntity;
private String url;
private InputStream in;
private HttpGetDataListener listener;
public HttpData(String url,HttpGetDataListener listener) {
this.url=url;
this.listener = listener;
}

@Override
protected String doInBackground(String... params) {

try {
mHttpClient = new DefaultHttpClient();
httpGet = new HttpGet(url);
mHttpResponse = mHttpClient.execute(httpGet);
mHttpEntity = mHttpResponse.getEntity();
//获取一个InputStream输入流对象,我们可以用这个流来操作文件
in = mHttpEntity.getContent();
//通过缓冲区进行读取
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuffer sb = new StringBuffer();
String str = null;
while((str=reader.readLine())!=null){
sb.append(str);
}
return sb.toString();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
protected void onPostExecute(String result) {
listener.getDataUrl(result);
super.onPostExecute(result);
}
}


————————————————————————————————————————

***HttpGetDataListener.java***
public interface HttpGetDataListener {
void getDataUrl(String data);
}


————————————————————————————————————————

***ListAdapter.java***
package huaxa.it.tulingdemo;

import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter {

private List<ListData> lists;
private Context mContext;
private RelativeLayout layout;
public ListAdapter(List<ListData> lists, Context mContext) {
this.lists = lists;
this.mContext = mContext;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return lists.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return lists.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(mContext);
if(lists.get(position).getFlag() == ListData.Recevier){
layout = (RelativeLayout) inflater.inflate(R.layout.left_layout, null);
}
if(lists.get(position).getFlag() == ListData.Send){
layout = (RelativeLayout) inflater.inflate(R.layout.right_layout, null);
}
TextView text  = (TextView) layout.findViewById(R.id.tv);
TextView time  = (TextView) layout.findViewById(R.id.time);
text.setText(lists.get(position).getContent());
time.setText(lists.get(position).getTime());
return layout;
}

}


————————————————————————————————————————

***ListData***
package huaxa.it.tulingdemo;

public class ListData {
private String content;
public static final int Send = 1;
public static final int Recevier = 2;
public int flag;
public String time;
public ListData(String content, int flag, String time) {
setContent(content);
setFlag(flag);
setTime(time);
}
public String getTime() {
return time;
}
public void setTime(String time) {
// TODO Auto-generated method stub
this.time=time;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public  int getFlag() {
return flag;
}
public void setFlag(int flag) {
// TODO Auto-generated method stub
this.flag=flag;
}
}


<uses-permission android:name="android.permission.INTERNET"/>


_补充————bug修正————————

出现bug原因:ArrayList 删除问题

正序遍历删除

* 结果:只删除了一半

* 原因:每删除一个,size变小,要删除下一个前需移一位,下次相当于是隔一个再删除

改成:倒序遍历删除(每次都删除最后一个)就可以了。

if (lists.size() > 30) {
for (int i =lists.size()-6; i >= 0; i--) {
lists.remove(i);
}
}


问题解答:ArrayList删除remove出现的只删除了一半,点击查看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: