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

一、适配器编写

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

 package com.fuly.kun;

 import java.text.SimpleDateFormat;
import java.util.List; import com.fuly.kun.bean.ChatMsg; import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; //ListView的适配器
//这里主要注意当子项有不同的布局方式时,代码怎么编写
public class MyAdapter extends BaseAdapter{ private List<ChatMsg> mDatas;
private LayoutInflater inflater; public MyAdapter(Context context, List<ChatMsg> datas) { this.mDatas = datas; inflater = LayoutInflater.from(context); } //该方法用来获取不同的view的id号
public int getItemViewType(int position) { ChatMsg cm = mDatas.get(position);
if(cm.getType() == ChatMsg.Type.INPUT){
return 0;//将输入消息的子项布局编号为0
}else{
return 1;//将显示服务器消息的子项布局编号为1
} } //该方法用来获取共有多少条数据
public int getCount() { return mDatas.size();
} //该方法用来获取具体位置的数据对象
public Object getItem(int position) { return mDatas.get(position);
} //该方法用来获取位置的序号,直接返回位置即可
public long getItemId(int position) { return position;
} //该方法用来告诉ListView的子项共有几种布局
//我们这里有两种
public int getViewTypeCount() { return 2;
} //下面开始真的为子项编写具体的view
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh = null; if(convertView == null){
vh = new ViewHolder(); //根据不同的标号获得不同的子项布局
if(getItemViewType(position) == 0){
convertView = inflater.inflate(R.layout.item_in,parent,false);
vh.mText = (TextView) convertView.findViewById(R.id.tv_inmsg);
}
if(getItemViewType(position) == 1){
convertView = inflater.inflate(R.layout.item_out,parent,false);
vh.mDate = (TextView) convertView.findViewById(R.id.tv_out_date);
vh.mText = (TextView) convertView.findViewById(R.id.tv_outmsg);
} convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
} ChatMsg cm = mDatas.get(position); //设置数据
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(vh.mDate != null){
vh.mDate.setText(df.format(cm.getDate()));
}
vh.mText.setText(cm.getMsg()); return convertView;
} class ViewHolder{ private TextView mDate;
private TextView mText;
} }

二、MainActivity的编写

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

 package com.fuly.kun;

 import java.util.ArrayList;
import java.util.Date;
import java.util.List; import com.fuly.kun.bean.ChatMsg;
import com.fuly.kun.bean.ChatMsg.Type;
import com.fuly.kun.util.HttpUtil; import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast; public class MainActivity extends Activity { private ListView lv;
private MyAdapter mAdapter;
private List<ChatMsg> mDatas = new ArrayList<ChatMsg>(); private ImageButton btn;
private EditText et; private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { ChatMsg cms= (ChatMsg) msg.obj;
mDatas.add(cms);//加入到数据集
mAdapter.notifyDataSetChanged();//通知lv更新
lv.setSelection(mDatas.size()-1);//将lv设定为显示最后一项
};
}; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView();//初始化数据等 btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { if(et.getText().toString().equals("")){
Toast.makeText(MainActivity.this, R.string.info, Toast.LENGTH_LONG).show();
}else{ //下面的代码为把输入框中消息也封装非ChatMsg。并显示在listView中 ChatMsg cts = new ChatMsg();
cts.setMsg(et.getText().toString());
cts.setDate(new Date());
cts.setType(ChatMsg.Type.INPUT); mDatas.add(cts); mAdapter.notifyDataSetChanged(); lv.setSelection(mDatas.size()-1);//将lv设定为显示最后一项 //下面的代码为从服务器端获取数据
new Thread(new Runnable(){
public void run(){ String jsonMsg = HttpUtil.doGet(et.getText().toString()); ChatMsg cmg = HttpUtil.getResultMsg(jsonMsg); Message msg = new Message();
msg.obj = cmg;
mHandler.sendMessage(msg); }
}).start(); } et.setText("");//最后将编辑框清空 }
}); //显示最初的数据
ChatMsg cg = new ChatMsg("嘿嘿,小昆为你服务!",new Date(),ChatMsg.Type.OUTPUT);
mDatas.add(cg);
mAdapter = new MyAdapter(this, mDatas);
lv.setAdapter(mAdapter);
} private void initView() { btn = (ImageButton) findViewById(R.id.btn_send);
et = (EditText) findViewById(R.id.et_inmsg);
lv = (ListView) findViewById(R.id.listview_msg); if(mDatas != null){
mAdapter = new MyAdapter(this, mDatas);
} } }

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

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

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

最新文章

  1. 关于最近Google无法正常访问的变通之法(已经被墙)
  2. Linux屏幕录制gif的工具及教程
  3. 去掉eclipse上编辑时的提示
  4. 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(2)--前端,以及前后端Session
  5. oracle导出数据显示出现ora-00109或者LRM-00109出错修改办法
  6. js函数定时器,定时读取系统实时连接数
  7. WebAPI上传大文件
  8. HTML5----input-datalist输入框自己主动提示功能
  9. C#将Excel数据表导入SQL数据库的两种方法(转)
  10. #Java学习之路——基础阶段(第九篇)
  11. float浮动-清浮动BFC渲染机制
  12. git reset 版本回退的三种用法总结
  13. 线程同步Volatile与Synchronized(一)
  14. Noj - 在线强化训练1
  15. Math.log()对数的妙用
  16. OpenJ_Bailian - 4152 最佳加法表达式 dp
  17. 【Quartz】Quartz将Job保存在数据库中所需表的说明
  18. IT(然而其实是。。hdu5244?)
  19. Jmeter----请求的reponse结果中的某个参数作为JDBC Request的查询条件
  20. 【BZOJ2982】combination Lucas定理

热门文章

  1. 兼容ie6的ul水平居中对齐
  2. 设置固定ip后无法上公网
  3. MySQL:ERROR 1045 (28000): Access denied for user &#39;ODBC&#39;@&#39;localhost&#39; (using password: NO)
  4. JAVA学习之路(多线程)---模拟售票(细解)
  5. 【Android】10.0 UI开发——如何编写程序界面、常见控件的使用
  6. C语言——栈的基本运算在顺序栈上的实现
  7. [转载]hive中order by,sort by, distribute by, cluster by作用以及用法
  8. Android 集成百度统计
  9. python SQLAchemy外键关联
  10. FPGA学习系列 各种门器件程序积累