图灵智能对话机器人DEMO

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>

__________`__________________

***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());
        lists.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出现的只删除了一半,点击查看

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值