仿QQ对话框

从网上搜集了些资料,做了一个仿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

demo下载地址:http://download.csdn.net/detail/duduhali/9112397

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值