从网上搜集了些资料,做了一个仿QQ聊天窗口。调用我自己在新浪云平台的一个PHP文件,由它再调用simsimi引擎,实现聊天机器人功能。
做仿QQ两天界面,要在listview的适配器里面根据列表项类型选择加载不同的布局文件
最核心的一个类
ChatMsgViewAdapter.java
public class ChatMsgViewAdapter extends BaseAdapter {
//列表数据项的内容,共二种
public static interface IMsgViewType
{
//
int IMVT_COM_MSG = 0;
//
int IMVT_TO_MSG = 1;
}
private static final String TAG = ChatMsgViewAdapter.class.getSimpleName();
private List<ChatMsgEntity> data;
private Context context;
private LayoutInflater mInflater;
public ChatMsgViewAdapter(Context context, List<ChatMsgEntity> data) {
this.context = context;
this.data = data;
//LayoutInflater类似findViewById,只是LayoutInflater是找res/layout/下的.xml文件
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
return position;
}
//item类型有两种
public int getItemViewType(int position) {
// TODO Auto-generated method stub
ChatMsgEntity entity = data.get(position);
if (entity.getMsgType())
{
return IMsgViewType.IMVT_COM_MSG;
}else{
return IMsgViewType.IMVT_TO_MSG;
}
}
//和上面的item类型对应
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 2;
}
//
public View getView(int position, View convertView, ViewGroup parent) {
ChatMsgEntity entity = data.get(position);
boolean isComMsg = entity.getMsgType();
ViewHolder viewHolder = null;
if (convertView == null)
{
if (isComMsg)
{
//根据类型选择加载不同的布局
convertView = mInflater.inflate(R.layout.chat_item_left, null);
}else{
//
convertView = mInflater.inflate(R.layout.chat_item_right, null);
}
viewHolder = new ViewHolder();
viewHolder.tvSendTime = (TextView) convertView.findViewById(R.id.tv_sendtime);
viewHolder.tvUserName = (TextView) convertView.findViewById(R.id.tv_username);
viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_chatcontent);
viewHolder.isComMsg = isComMsg;
convertView.setTag(viewHolder);
}else{
//会根据类型返回相应的ViewHolder
viewHolder = (ViewHolder) convertView.getTag();
}
//设置数据
viewHolder.tvSendTime.setText(entity.getDate());
viewHolder.tvUserName.setText(entity.getName());
viewHolder.tvContent.setText(entity.getText());
return convertView;
}
//
static class ViewHolder {
public TextView tvSendTime;
public TextView tvUserName;
public TextView tvContent;
public boolean isComMsg = true;
}
}
业务逻辑实现
MainActivity.java
public class MainActivity extends Activity implements OnClickListener {
private Button bt_send;
private Button bt_back;
private EditText et_send;
private ChatMsgViewAdapter myAdapter;//listview的内容适配器
private ListView listview;
private List<ChatMsgEntity> myDataArrays = new ArrayList<ChatMsgEntity>();//
private RequestQueue volleyQueue;
//一个网址,只是简单的调用simsimi
final private String control = "http://aipet.sinaapp.com/control.php?message=";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//取消窗口标题
setContentView(R.layout.chat_layout);
volleyQueue = Volley.newRequestQueue(this);//
initView();//初始化组件
myAdapter = new ChatMsgViewAdapter(this, myDataArrays);
listview.setAdapter(myAdapter);
received("Hi,Sir");//设置一个初始数据
volleyQueue.start();
}
/**Volley网络请求正常响应监听器*/
private Listener<JSONObject> netListener = new Listener<JSONObject>(){
@Override
public void onResponse(JSONObject res) {
// TODO Auto-generated method stub
try {
received( res.getString("response") );
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
/**Volley网络请求异常响应监听器*/
private ErrorListener errorListener = new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "网络连接异常",
Toast.LENGTH_LONG).show();
}
};
/**初始化组件*/
private void initView() {
listview = (ListView) findViewById(R.id.listview);
bt_back = (Button) findViewById(R.id.bt_back);
bt_back.setOnClickListener(this);
bt_send = (Button) findViewById(R.id.bt_send);
bt_send.setOnClickListener(this);
et_send = (EditText) findViewById(R.id.et_send);
}
public void onClick(View view) {
// TODO Auto-generated method stub
switch(view.getId()) {
case R.id.bt_back:
back();
break;
case R.id.bt_send:
send();
break;
}
}
/**接受消息,正常请求会数据后调用,在左边添加一条消息*/
private void received(String receiveStr)
{
//添加一条消息
ChatMsgEntity entity = new ChatMsgEntity();
entity.setDate(getDate());
entity.setName("AI");
entity.setMsgType(true);//
entity.setText( receiveStr );
myDataArrays.add(entity);
myAdapter.notifyDataSetChanged();//通知listview数据已更新
listview.setSelection(listview.getCount() - 1);//列表定位到最后一行
}
/** 发送消息,点击发送按钮后调用的方法,将在右边添加一条消息 */
private void send()
{
String contString = et_send.getText().toString().trim();
if (contString.length() > 0)
{
//添加一条消息
ChatMsgEntity entity = new ChatMsgEntity();
entity.setDate(getDate());
entity.setName("user");
entity.setMsgType(false);//
entity.setText(contString);
myDataArrays.add(entity);
myAdapter.notifyDataSetChanged();//通知listview数据已更新
et_send.setText("");//清空输入框
listview.setSelection(listview.getCount() - 1);//列表定位到最后一行
//加入网络请求队列
volleyQueue.add( new JsonObjectRequest(Method.GET,control
+contString,
null, netListener, errorListener)
);
}
}
/**获取时间*/
private String getDate() {
Calendar c = Calendar.getInstance();
String year = String.valueOf(c.get(Calendar.YEAR));
String month = String.valueOf(c.get(Calendar.MONTH));
String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH) + 1);
String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY));
String mins = String.valueOf(c.get(Calendar.MINUTE));
StringBuffer sbBuffer = new StringBuffer();
sbBuffer.append(year + "-" + month + "-" + day + " " + hour + ":" + mins);
return sbBuffer.toString();
}
private void back() {
//volleyQueue.stop();
finish();
}
}
详细代码请下载demo