好了,一切准备工作都完成了,下面我们就可以真正的编写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" />
好了,一切都已经编写完成了。我们的项目结束了,是不是迫不及待的要和你的机器人聊天了呢?赶紧运行该程序吧!!