亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

安卓智能聊天機器人開發(二)

2019-11-14 21:49:46
字體:
來源:轉載
供稿:網友
安卓智能聊天機器人開發(二)

接上一篇文章《安卓智能聊天機器人開發(一)》,晚上繼續寫。

在上一篇文章中,已經實現了對網絡數據的獲取和處理封裝,這篇文章來講下如何嵌入到安卓應用中。

先看下效果圖:

從上面兩張圖我們可以發現,這個聊天布局其實就是一個ListView,只不過它和傳統的ListView有些區別,因為它使用了多Item樣式布局

首先,先來分析下基礎布局:

這個界面是由3個布局文件組成,分別是主布局,發送消息樣式布局,接收消息樣式布局

先來看下主布局:

這里是對應的主布局代碼:

android:divider="@null"  --去除ListView的Item分割線

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     android:background="@drawable/chat_bg_default" > 6  7     <LinearLayout 8         android:id="@+id/title" 9         android:layout_width="fill_parent"10         android:layout_height="wrap_content"11         android:layout_alignParentTop="true"12         android:background="@drawable/title_bar"13         android:gravity="center"14         android:orientation="vertical" >15 16         <TextView17             android:layout_width="wrap_content"18             android:layout_height="fill_parent"19             android:layout_gravity="center"20             android:text="機器兔"21             android:textColor="@android:color/white"22             android:textSize="20sp" />23     </LinearLayout>24 25     <RelativeLayout26         android:id="@+id/bottom"27         android:layout_width="fill_parent"28         android:layout_height="55dp"29         android:layout_alignParentBottom="true"30         android:background="@drawable/bottom_bar"31         android:padding="5dp" >32 33         <EditText34             android:id="@+id/send_message"35             android:layout_width="fill_parent"36             android:layout_height="wrap_content"37             android:layout_alignParentLeft="true"38             android:layout_centerVertical="true"39             android:layout_marginLeft="5dp"40             android:layout_marginRight="5dp"41             android:background="@drawable/login_edit_normal" />42 43         <Button44             android:id="@+id/send_bt"45             android:layout_width="wrap_content"46             android:layout_height="fill_parent"47             android:layout_alignParentRight="true"48             android:layout_alignRight="@id/send_message"49             android:background="@drawable/send_button_selector"50             android:gravity="center_vertical"51             android:text="發送" />52     </RelativeLayout>53 54     <ListView55         android:id="@+id/chatlistview"56         android:layout_width="fill_parent"57         android:layout_height="fill_parent"58         android:layout_above="@id/bottom"59         android:layout_below="@id/title"60         android:divider="@null" >61     </ListView>62 63 </RelativeLayout>

再來看下消息布局:(由于消息布局只是左右兩邊方向的不同,這里只給出其中一個)

這是2個消息布局的代碼:

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     android:orientation="vertical" > 6  7     <TextView 8           android:id="@+id/sendtime" 9         android:layout_width="wrap_content"10         android:layout_height="wrap_content"11         android:layout_gravity="center"12         android:background="#999999"13         android:text="2014-11-07 18:00"14         android:textColor="@android:color/white" />15 16     <LinearLayout17         android:layout_width="match_parent"18         android:layout_height="wrap_content"19         android:orientation="horizontal" >20 21         <LinearLayout22             android:layout_width="wrap_content"23             android:layout_height="wrap_content"24             android:orientation="vertical" >25 26             <!-- 頭像昵稱部分 -->27 28             <ImageView29                 android:layout_width="50dp"30                 android:layout_height="50dp"31                 android:src="@drawable/icon1" />32 33             <TextView34                 android:layout_width="wrap_content"35                 android:layout_height="wrap_content"36                 android:layout_gravity="center"37                 android:text="機器兔" />38         </LinearLayout>39 40         <TextView41             android:id="@+id/sendmsg"42             android:layout_width="wrap_content"43             android:layout_height="wrap_content"44             android:background="@drawable/chatfrom_bg_normal"45             android:text="你好,我是機器兔。" />46     </LinearLayout>47 48 </LinearLayout>
 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     android:orientation="vertical" > 6  7     <TextView 8         android:id="@+id/receivetime" 9         android:layout_width="wrap_content"10         android:layout_height="wrap_content"11         android:layout_gravity="center"12         android:background="#999999"13         android:text="2014-11-07 18:00"14         android:textColor="@android:color/white" />15 16     <LinearLayout17         android:layout_width="fill_parent"18         android:layout_height="wrap_content"19         android:gravity="right"20         android:orientation="horizontal" >21 22         <TextView23             android:id="@+id/receivemsg"24             android:layout_width="wrap_content"25             android:layout_height="wrap_content"26             android:background="@drawable/chatto_bg_normal"27             android:text="你好,我是機器兔。"28             android:textColor="@android:color/black" />29 30         <LinearLayout31             android:layout_width="wrap_content"32             android:layout_height="wrap_content"33             android:orientation="vertical" >34 35             <!-- 頭像昵稱部分 -->36 37             <ImageView38                 android:layout_width="50dp"39                 android:layout_height="50dp"40                 android:src="@drawable/icon" />41 42             <TextView43                 android:layout_width="wrap_content"44                 android:layout_height="wrap_content"45                 android:layout_gravity="right"46                 android:text="我" />47         </LinearLayout>48     </LinearLayout>49 50 </LinearLayout>

接下來看下關于ListView的自定義適配器,和往常一樣自定義適配器需要繼承BaseAdapter,并實現一些必須的方法

這里有個需要注意的是,因為傳統的ListView是統一一個樣式的,而這里的聊天布局是左右兩邊收發信息多Item樣式

所以需要額外的多覆寫2個方法:

1、getViewTypeCount  --返回樣式的種類數目

2、getItemViewType   --給定類型標示符,便于在回調函數getView時讓系統知道我們需要顯示的哪個樣式

代碼里還提到了ViewHolder,這個是優化ListView加載速度的一種方法,關于這個知識點我整理一篇筆記《安卓開發筆記——ListView加載性能優化ViewHolder

》出來,不熟悉的朋友可以看看。

  1 package com.example.androidchat;  2   3 import java.text.SimpleDateFormat;  4 import java.util.List;  5   6 import com.example.pojo.Msg;  7 import com.example.pojo.Msg.Type;  8   9 import android.content.Context; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.ViewGroup; 13 import android.widget.BaseAdapter; 14 import android.widget.TextView; 15 /** 16  *  17  * ListView適配器 18  * 19  */ 20 public class ChatAdapter extends BaseAdapter { 21  22     PRivate List<Msg> data; 23     private LayoutInflater inflater;// 布局工廠,可以把res/layout的xml布局文件轉換成view對象 24  25     public ChatAdapter(Context context, List<Msg> data) { 26         inflater = LayoutInflater.from(context); 27         this.data = data; 28     } 29  30     @Override 31     public int getCount() { 32         return data.size(); 33     } 34  35     @Override 36     public Object getItem(int position) { 37         return data.get(position); 38     } 39  40     @Override 41     public long getItemId(int position) { 42         return position; 43     } 44  45     @Override 46     public View getView(int position, View convertView, ViewGroup parent) { 47         Msg message = data.get(position); 48         ViewHolder viewHolder = null; 49         if (convertView == null) {// 未加載布局文件對象 50             // 可以通過getItemViewType所定義的標識來設定對應的item樣式 51             if (getItemViewType(position) == 0) {// 接收信息 52                 viewHolder = new ViewHolder(); 53                 convertView = inflater.inflate(R.layout.send_msg, null); 54                 viewHolder.time = (TextView) convertView 55                         .findViewById(R.id.receivetime); 56                 viewHolder.msg = (TextView) convertView 57                         .findViewById(R.id.receivemsg); 58             } else { 59                 viewHolder = new ViewHolder(); 60                 convertView = inflater.inflate(R.layout.receive_msg, null); 61                 viewHolder.time = (TextView) convertView 62                         .findViewById(R.id.sendtime); 63                 viewHolder.msg = (TextView) convertView 64                         .findViewById(R.id.sendmsg); 65             } 66             convertView.setTag(viewHolder); 67         } else {// 已經存在布局文件對象 68             viewHolder = (ViewHolder) convertView.getTag(); 69         } 70  71         // 設置數據 72         SimpleDateFormat dateFormat = new SimpleDateFormat( 73                 "yyyy-MM-dd HH:mm:ss"); 74         viewHolder.time.setText(dateFormat.format(message.getTime())); 75         viewHolder.msg.setText(message.getMsg()); 76         return convertView; 77     } 78  79     /** 80      * 由于此處我們要返回2種ListView的Item樣式,需要再額外多覆寫2個方法  81      * (1)、getItemViewType(int position)給定類型標示符  82      * (2)、getViewTypeCount() 類型數量 83      */ 84     @Override 85     public int getItemViewType(int position) { 86         Msg message = data.get(position); 87         if (message.getType() == Type.INCOME) { 88             return 0;// 如果消息類型為接收,則值為0 89         } 90         return 1;// 如果消息類型為發送,則值為1 91     } 92  93     @Override 94     public int getViewTypeCount() { 95         return 2; 96     } 97  98     private final class ViewHolder { 99         TextView time;// 消息時間100         TextView msg;// 消息內容101     }102 103 }

然后就是主程序代碼了:

這里就沒什么好說的了,網絡數據獲取工具類包括ListView的適配器類在之前已經提過,這里就只剩下調用了。

注意點有3:

1、那就是在UI主線程里不能直接取獲取網絡數據,這里我們需要另開一個子線程去獲取,然后在通過Handler去更新UI界面。

2、當數據源發生更新的時候,需要在UI主線程去操作,而不是子線程,還有就是不應該去重新設置Adapter,只需要去調用Adapter的notifyDataSetChanged()就行。

3、記得設置下ListView的setSelection選項,便于焦點自動往下拉。

不在UI主線程里做耗時操作,會使得UI現成阻塞。不在子線程里去更新UI界面,會導致應用程序無響應。

 1 package com.example.androidchat; 2  3 import java.util.ArrayList; 4 import java.util.Date; 5 import java.util.List; 6  7 import android.app.Activity; 8 import android.os.Bundle; 9 import android.os.Handler;10 import android.os.Message;11 import android.view.View;12 import android.view.View.OnClickListener;13 import android.widget.Button;14 import android.widget.EditText;15 import android.widget.ListView;16 17 import com.example.pojo.Msg;18 import com.example.pojo.Msg.Type;19 import com.example.utils.GetDataUtils;20 21 public class MainActivity extends Activity {22 23     24     private ListView listview;25     private EditText sendmsg;26     private Button sendbt;27     private ChatAdapter adapter;//ListView自定義適配器28     private List<Msg> data;//數據源29 30     31     private Handler handler=new Handler(){32         public void handleMessage(Message msg) {33                 Msg receiveMsg=(Msg) msg.obj;34                 data.add(receiveMsg);35                 adapter.notifyDataSetChanged();36                 listview.setSelection(data.size()-1);//定位位置,自動下拉37             38         };39     };40     @Override41     protected void onCreate(Bundle savedInstanceState) {42         super.onCreate(savedInstanceState);43         setContentView(R.layout.activity_main);44         45         initView();//初始化控件46         initData();//初始化數據47         initAction();//初始化事件48     }49 50     private void initAction() {51         this.sendbt.setOnClickListener(new OnClickListener() {52             53             @Override54             public void onClick(View v) {55                 /**56                  * 點擊發送按鈕執行步驟57                  * 1、獲取用戶輸入的內容并顯示到ListView(判斷是否為空)58                  * 2、發送用戶輸入的內容到服務端獲取服務端返回內容并顯示到ListView(注意線程處理)59                  * 3、清空輸入框60                  */61                 final String sendInfo=sendmsg.getText().toString();//獲取用戶輸入數據(用于發送)62                 data.add(new Msg("",sendInfo,new Date(),Type.INCOME));63                 adapter.notifyDataSetChanged();//更新數據源64                 listview.setSelection(data.size()-1);//定位位置,自動下拉65                 sendmsg.setText("");66                 67                 68                 //向服務端發送信息并接收返回信息,由于UI主線程不能執行網絡獲取操作,這里需要開一個子線程69                 new Thread(){70 71                     @Override72                     public void run() {73                         //執行網絡操作74                         GetDataUtils dataUtils=new GetDataUtils();75                         Msg msg=dataUtils.getInfo(sendInfo);//獲取到一個Msg對象,但由于子線程不能夠更新UI,所以需要用到一個Handler76                         Message message=Message.obtain();77                         message.obj=msg;//封裝信息78                         handler.sendMessage(message);79                     }80                     81                 }.start();82             }83         });84     }85 86 private void initData() {87         data=new ArrayList<Msg>();88         adapter=new ChatAdapter(MainActivity.this,data);//獲取ListView適配器實例89         listview.setAdapter(adapter);90     }91 92     private void initView() {93         this.listview=(ListView) MainActivity.this.findViewById(R.id.chatlistview);94         this.sendmsg=(EditText) findViewById(R.id.send_message);95         this.sendbt=(Button) findViewById(R.id.send_bt);96     }97 98 99 }

好了,到此"安卓智能聊天機器人”就已經完成了,雖說這個機器人有點二,不過在無聊之余還是可以打發打發時間的哈~

作者:Balla_兔子出處:http://www.49028c.com/lichenwei/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得準,我分文不收;相不準,你也好回來找我!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩国国内大量揄拍精品视频| 亚洲淫片在线视频| 精品视频一区在线视频| 91精品国产九九九久久久亚洲| 亚洲黄一区二区| 亚洲精品一区在线观看香蕉| 国产精品96久久久久久又黄又硬| 国产成人精品综合| 欧美电影第一页| 亚洲精品电影在线观看| 黑人巨大精品欧美一区二区三区| 国产精品久久久久久久久男| 久久在线精品视频| 久久久精品在线观看| 中文字幕在线成人| 国产69精品久久久久99| 久久久www成人免费精品张筱雨| 国产免费久久av| 欧美性videos高清精品| 日韩精品视频免费专区在线播放| 成人啪啪免费看| 国产精品久久久久久久久久| 精品国产依人香蕉在线精品| 91色在线视频| 亚洲欧美制服第一页| 九九热视频这里只有精品| 日韩国产欧美精品一区二区三区| 欧美黄色片视频| 国产精品一区专区欧美日韩| 一区二区欧美亚洲| 91色琪琪电影亚洲精品久久| 欧美日韩激情视频8区| 久久久综合免费视频| 久热精品视频在线观看| 日韩在线观看高清| 国产亚洲一区精品| 亚洲欧美国产日韩天堂区| 在线观看成人黄色| 欧美成人激情视频免费观看| 亚洲综合在线做性| 精品国产成人av| 日本精品视频在线| 日韩成人av网| 亚洲美女性生活视频| 97人人做人人爱| 性欧美办公室18xxxxhd| 69视频在线播放| 黑人狂躁日本妞一区二区三区| 国产精品露脸av在线| 9.1国产丝袜在线观看| 欧美xxxx做受欧美.88| 亚洲最大av网| 成人看片人aa| 性夜试看影院91社区| 日韩大片免费观看视频播放| 日韩在线观看成人| 成人网在线视频| 亚洲自拍在线观看| 亚洲欧美日韩一区二区三区在线| 欧美另类99xxxxx| 日韩中文第一页| 国产精品91免费在线| 57pao成人国产永久免费| 欧美最猛黑人xxxx黑人猛叫黄| 尤物九九久久国产精品的分类| 亚洲国产精品热久久| 久久国产精品视频| 97热在线精品视频在线观看| 国产亚洲人成a一在线v站| 中文.日本.精品| 97在线视频免费播放| 亚洲国产欧美精品| 国产精品久久久| 日韩av日韩在线观看| 69影院欧美专区视频| 亚洲缚视频在线观看| www.日韩免费| 久久人体大胆视频| 成人久久18免费网站图片| 精品国产一区二区三区久久狼黑人| 中文字幕国产亚洲| 亚洲jizzjizz日本少妇| 久久久av网站| 日韩午夜在线视频| 91av视频在线| 中文字幕亚洲一区在线观看| 国产精品自产拍高潮在线观看| 亚洲精品久久久久国产| 在线观看欧美成人| 91精品国产综合久久香蕉| 欧美成人第一页| 久久99精品久久久久久噜噜| 色小说视频一区| 亚洲人免费视频| 亚洲欧美日本精品| 日韩精品视频观看| 亚洲成人精品久久久| 91在线精品播放| 国内精品美女av在线播放| 国产精品一区二区三| 亚洲激情在线观看视频免费| 91人成网站www| 欧美丰满少妇xxxxx做受| 欧美成人免费在线视频| 亚洲乱码国产乱码精品精天堂| 亚洲字幕一区二区| 欧美激情高清视频| 4444欧美成人kkkk| 欧美性极品xxxx做受| 欧美日韩一区二区免费在线观看| 26uuu另类亚洲欧美日本一| 爱福利视频一区| 精品欧美国产一区二区三区| 欧美老女人bb| 日韩欧美视频一区二区三区| 不用播放器成人网| 欧美黑人性视频| 国产伊人精品在线| 久久久精品久久久| 亚洲国产毛片完整版| 中文字幕精品一区二区精品| 日韩欧美在线视频日韩欧美在线视频| 久久在线观看视频| 国产精品久久久久久久久久99| 日日骚av一区| 最近2019中文字幕在线高清| 91国内精品久久| 亚洲一区国产精品| 久久综合伊人77777| 久久精品久久久久久国产 免费| 国产精品视频区| 久久网福利资源网站| 国内精品模特av私拍在线观看| 亚洲欧美精品在线| 日本国产精品视频| 国产精品视频公开费视频| 热99久久精品| 一本色道久久88综合亚洲精品ⅰ| 2019亚洲日韩新视频| 韩国国内大量揄拍精品视频| 性色av一区二区三区| 亚洲天堂av高清| 欧美视频在线观看 亚洲欧| 日本在线观看天堂男亚洲| 亚洲成人av在线| 欧美日韩高清在线观看| 欧美日韩中文字幕综合视频| 亚洲成年人在线播放| 91久久久亚洲精品| 国产精品偷伦免费视频观看的| 欧美日韩中文字幕综合视频| 日韩美女在线看| 高清亚洲成在人网站天堂| 欧美激情一级欧美精品| 国色天香2019中文字幕在线观看| 最近2019中文字幕在线高清| 中文字幕久久久| 欧美一区三区三区高中清蜜桃| 欧美放荡办公室videos4k| 久久成人精品电影| 日韩国产激情在线| 日韩高清电影免费观看完整版| 国产精品电影久久久久电影网| 国产精品日日做人人爱|