好了,一切准备工作都完成了,下面我们就可以真正的编写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" />

 

 

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

posted on 2015-10-02 20:05  fuly  阅读(382)  评论(0编辑  收藏  举报