zoukankan      html  css  js  c++  java
  • 智能机器人“小昆”的实现(五)MainActivty的实现及项目结束

          好了,一切准备工作都完成了,下面我们就可以真正的编写MainActivity了。在MainActivity中,我们要为ListView设定适配器,并为发送按钮设定点击事件。我们的逻辑就是点击发送按钮,就会将发送的消息显示在ListView中,同时获取服务器返回的消息也显示的ListView中。如果你经常写ListView的实现,这对你来说应该不是难点。注意为了实现ListView子项的两种布局,我们使用BaseAdapter。好了,废话不多说,直接进入代码。好多东西,其实在代码以及代码注释中写的很清楚了。

    一、适配器编写

           如果不知道怎么写两种子项布局的ListView,应该好好学习这段代码。如下:

      1 package com.fuly.kun;
      2 
      3 import java.text.SimpleDateFormat;
      4 import java.util.List;
      5 
      6 import com.fuly.kun.bean.ChatMsg;
      7 
      8 import android.content.Context;
      9 import android.util.Log;
     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 //ListView的适配器
     17 //这里主要注意当子项有不同的布局方式时,代码怎么编写
     18 public class MyAdapter extends BaseAdapter{
     19 
     20     private List<ChatMsg> mDatas;
     21     private LayoutInflater inflater;
     22     
     23     public MyAdapter(Context context, List<ChatMsg> datas) {
     24         
     25         this.mDatas = datas;
     26         
     27         inflater = LayoutInflater.from(context);
     28     
     29     }
     30 
     31     //该方法用来获取不同的view的id号
     32     public int getItemViewType(int position) {
     33         
     34         ChatMsg cm = mDatas.get(position);
     35         if(cm.getType() == ChatMsg.Type.INPUT){
     36             return 0;//将输入消息的子项布局编号为0
     37         }else{
     38             return 1;//将显示服务器消息的子项布局编号为1
     39         }
     40     
     41     }
     42 
     43     //该方法用来获取共有多少条数据
     44     public int getCount() {
     45         
     46         return mDatas.size();
     47     }
     48 
     49     //该方法用来获取具体位置的数据对象
     50     public Object getItem(int position) {
     51         
     52         return mDatas.get(position);
     53     }
     54 
     55     //该方法用来获取位置的序号,直接返回位置即可
     56     public long getItemId(int position) {
     57         
     58         return position;
     59     }
     60 
     61     //该方法用来告诉ListView的子项共有几种布局
     62     //我们这里有两种
     63     public int getViewTypeCount() {
     64         
     65         return 2;
     66     }
     67 
     68     //下面开始真的为子项编写具体的view
     69     public View getView(int position, View convertView, ViewGroup parent) {
     70         
     71         ViewHolder  vh = null;
     72         
     73         if(convertView == null){
     74             vh = new ViewHolder();
     75             
     76             //根据不同的标号获得不同的子项布局
     77             if(getItemViewType(position) == 0){
     78                 convertView = inflater.inflate(R.layout.item_in,parent,false);
     79                 vh.mText = (TextView) convertView.findViewById(R.id.tv_inmsg);
     80             }
     81             if(getItemViewType(position) == 1){
     82                 convertView = inflater.inflate(R.layout.item_out,parent,false);
     83                 vh.mDate = (TextView) convertView.findViewById(R.id.tv_out_date);
     84                 vh.mText = (TextView) convertView.findViewById(R.id.tv_outmsg);
     85             }
     86             
     87             convertView.setTag(vh);
     88         }else{
     89             vh = (ViewHolder) convertView.getTag();
     90         }
     91         
     92         ChatMsg cm = mDatas.get(position);
     93         
     94         //设置数据
     95         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     96         if(vh.mDate != null){
     97             vh.mDate.setText(df.format(cm.getDate()));
     98         }
     99         vh.mText.setText(cm.getMsg());
    100 
    101         
    102         return convertView;
    103     }
    104     
    105     class ViewHolder{
    106         
    107         private TextView mDate;
    108         private TextView mText;
    109     }
    110     
    111 
    112 }

    二、MainActivity的编写

        废话不多说了,直接上代码:

      1 package com.fuly.kun;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Date;
      5 import java.util.List;
      6 
      7 import com.fuly.kun.bean.ChatMsg;
      8 import com.fuly.kun.bean.ChatMsg.Type;
      9 import com.fuly.kun.util.HttpUtil;
     10 
     11 import android.os.Bundle;
     12 import android.os.Handler;
     13 import android.os.Message;
     14 import android.app.Activity;
     15 import android.view.Menu;
     16 import android.view.View;
     17 import android.view.View.OnClickListener;
     18 import android.widget.EditText;
     19 import android.widget.ImageButton;
     20 import android.widget.ListView;
     21 import android.widget.Toast;
     22 
     23 
     24 public class MainActivity extends Activity {
     25     
     26     private ListView lv;
     27     private MyAdapter mAdapter;
     28     private List<ChatMsg> mDatas = new ArrayList<ChatMsg>();
     29     
     30     private ImageButton btn;
     31     private EditText et;
     32     
     33     private Handler mHandler = new Handler(){
     34         
     35         public void handleMessage(android.os.Message msg) {
     36             
     37             ChatMsg cms= (ChatMsg) msg.obj;
     38             mDatas.add(cms);//加入到数据集
     39             mAdapter.notifyDataSetChanged();//通知lv更新
     40             lv.setSelection(mDatas.size()-1);//将lv设定为显示最后一项
     41         };
     42     };
     43 
     44 
     45     protected void onCreate(Bundle savedInstanceState) {
     46         super.onCreate(savedInstanceState);
     47         setContentView(R.layout.activity_main);
     48         
     49         initView();//初始化数据等
     50         
     51         btn.setOnClickListener(new OnClickListener() {
     52             
     53         
     54             public void onClick(View v) {
     55             
     56                 
     57                 if(et.getText().toString().equals("")){
     58                     Toast.makeText(MainActivity.this, R.string.info, Toast.LENGTH_LONG).show();
     59                 }else{
     60                     
     61                     //下面的代码为把输入框中消息也封装非ChatMsg。并显示在listView中
     62                     
     63                     ChatMsg cts = new ChatMsg();
     64                     cts.setMsg(et.getText().toString());
     65                     cts.setDate(new Date());
     66                     cts.setType(ChatMsg.Type.INPUT);
     67                     
     68                     mDatas.add(cts);
     69                     
     70                     mAdapter.notifyDataSetChanged();
     71                     
     72                     lv.setSelection(mDatas.size()-1);//将lv设定为显示最后一项
     73 
     74                     
     75                     //下面的代码为从服务器端获取数据
     76                     new Thread(new Runnable(){
     77                         public void run(){
     78                             
     79                             String jsonMsg = HttpUtil.doGet(et.getText().toString());
     80                             
     81                             
     82                                 ChatMsg cmg = HttpUtil.getResultMsg(jsonMsg);
     83                                 
     84                                 Message msg = new Message();
     85                                 msg.obj = cmg;
     86                                 mHandler.sendMessage(msg);
     87                         
     88                         
     89                             
     90                         }
     91                         }).start();
     92                     
     93                     
     94                 }
     95                 
     96                 
     97                 et.setText("");//最后将编辑框清空
     98                 
     99             }
    100         });
    101         
    102         //显示最初的数据
    103         ChatMsg cg = new ChatMsg("嘿嘿,小昆为你服务!",new Date(),ChatMsg.Type.OUTPUT);
    104         mDatas.add(cg);
    105         mAdapter = new MyAdapter(this, mDatas);
    106         lv.setAdapter(mAdapter);
    107     }
    108 
    109 
    110     private void initView() {
    111         
    112         btn = (ImageButton) findViewById(R.id.btn_send);
    113         et = (EditText) findViewById(R.id.et_inmsg);
    114         lv = (ListView) findViewById(R.id.listview_msg);
    115         
    116         if(mDatas != null){
    117         mAdapter = new MyAdapter(this, mDatas);
    118         }
    119         
    120     }
    121 
    122 
    123 }

        对了,忘记之前说了,应该首先添加权限的:

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

       好了,一切都已经编写完成了。我们的项目结束了,是不是迫不及待的要和你的机器人聊天了呢?赶紧运行该程序吧!!

  • 相关阅读:
    window下安装QT出错解决方案
    wiin10下VS2015+opencv3.4.0-extra_modules+CMake配置
    可重入、线程安全辨析与场景举例
    WPF仿网易云音乐系列(三、播放进度条+控制按钮)
    WPF仿网易云音乐系列(二、歌单创建窗口+登录设置模块)
    WPF仿网易云音乐系列(一、左侧菜单栏:Expander+RadioButton)
    WPF仿网易云音乐系列(序)
    C# WPF仿360安全卫士11
    crontab的语法规则格式(每分钟、每小时、每天、每周、每月、每年定时执行 规则)
    Pymysql 连接 Mysql 数据库及增删改查操作
  • 原文地址:https://www.cnblogs.com/fuly550871915/p/4852646.html
Copyright © 2011-2022 走看看