package com.diandi.demo.adapter; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.text.SpannableString; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import com.diandi.demo.R; import com.diandi.demo.adapter.base.BaseListAdapter; import com.diandi.demo.adapter.base.ViewHolder; import com.diandi.demo.ui.activity.ImageBrowserActivity; import com.diandi.demo.ui.activity.LocationActivity; import com.diandi.demo.ui.activity.ProfileActivity; import com.diandi.demo.util.FaceTextUtils; import com.diandi.demo.util.ImageLoadOptions; import com.diandi.demo.util.TimeUtil; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import cn.bmob.im.BmobDownloadManager; import cn.bmob.im.BmobUserManager; import cn.bmob.im.bean.BmobMsg; import cn.bmob.im.config.BmobConfig; import cn.bmob.im.inteface.DownloadListener; /** * ******************************************************************************* * ********* Author : klob(kloblic@gmail.com) . * ********* Date : 2014-11-29 . * ********* Time : 11:46 . * ********* Project name : Diandi1.18 . * ********* Version : 1.0 * ********* Copyright @ 2014, klob, All Rights Reserved * ******************************************************************************* */ public class ChatAdapter extends BaseListAdapter<BmobMsg> { //8种Item的类型 //文本 private final int TYPE_RECEIVER_TXT = 0; private final int TYPE_SEND_TXT = 1; //图片 private final int TYPE_SEND_IMAGE = 2; private final int TYPE_RECEIVER_IMAGE = 3; //位置 private final int TYPE_SEND_LOCATION = 4; private final int TYPE_RECEIVER_LOCATION = 5; //语音 private final int TYPE_SEND_VOICE = 6; private final int TYPE_RECEIVER_VOICE = 7; String currentObjectId = ""; private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); public ChatAdapter(Context context, List<BmobMsg> msgList) { super(context, msgList); currentObjectId = BmobUserManager.getInstance(context).getCurrentUserObjectId(); } @Override public int getItemViewType(int position) { BmobMsg msg = mDataList.get(position); if (msg.getMsgType() == BmobConfig.TYPE_IMAGE) { return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_IMAGE : TYPE_RECEIVER_IMAGE; } else if (msg.getMsgType() == BmobConfig.TYPE_LOCATION) { return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_LOCATION : TYPE_RECEIVER_LOCATION; } else if (msg.getMsgType() == BmobConfig.TYPE_VOICE) { return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_VOICE : TYPE_RECEIVER_VOICE; } else { return msg.getBelongId().equals(currentObjectId) ? TYPE_SEND_TXT : TYPE_RECEIVER_TXT; } } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = bindView(position, convertView, parent); // 绑定内部点击监听 //addInternalClickListener(convertView, position, mDataList.get(position)); return convertView; } @Override public int getViewTypeCount() { return 8; } private View createViewByType(BmobMsg message, int position) { int type = message.getMsgType(); if (type == BmobConfig.TYPE_IMAGE) {//图片类型 return getItemViewType(position) == TYPE_RECEIVER_IMAGE ? mInflater.inflate(R.layout.item_chat_received_image, null) : mInflater.inflate(R.layout.item_chat_sent_image, null); } else if (type == BmobConfig.TYPE_LOCATION) {//位置类型 return getItemViewType(position) == TYPE_RECEIVER_LOCATION ? mInflater.inflate(R.layout.item_chat_received_location, null) : mInflater.inflate(R.layout.item_chat_sent_location, null); } else if (type == BmobConfig.TYPE_VOICE) {//语音类型 return getItemViewType(position) == TYPE_RECEIVER_VOICE ? mInflater.inflate(R.layout.item_chat_received_voice, null) : mInflater.inflate(R.layout.item_chat_sent_voice, null); } else {//剩下默认的都是文本 return getItemViewType(position) == TYPE_RECEIVER_TXT ? mInflater.inflate(R.layout.item_chat_received_message, null) : mInflater.inflate(R.layout.item_chat_sent_message, null); } } @Override public View bindView(final int position, View convertView, ViewGroup parent) { final BmobMsg item = mDataList.get(position); if (convertView == null) { convertView = createViewByType(item, position); } //文本类型 ImageView iv_avatar = ViewHolder.get(convertView, R.id.iv_avatar); final ImageView iv_fail_resend = ViewHolder.get(convertView, R.id.iv_fail_resend);//失败重发 final TextView tv_send_status = ViewHolder.get(convertView, R.id.tv_send_status);//发送状态 TextView tv_time = ViewHolder.get(convertView, R.id.tv_time); TextView tv_message = ViewHolder.get(convertView, R.id.tv_message); //图片 ImageView iv_picture = ViewHolder.get(convertView, R.id.iv_picture); final ProgressBar progress_load = ViewHolder.get(convertView, R.id.progress_load);//进度条 //位置 TextView tv_location = ViewHolder.get(convertView, R.id.tv_location); //语音 final ImageView iv_voice = ViewHolder.get(convertView, R.id.iv_voice); //语音长度 final TextView tv_voice_length = ViewHolder.get(convertView, R.id.tv_voice_length); //点击头像进入个人资料 String avatar = item.getBelongAvatar(); if (avatar != null && !avatar.equals("")) {//加载头像-为了不每次都加载头像 ImageLoader.getInstance().displayImage(avatar, iv_avatar, ImageLoadOptions.getOptions(), animateFirstListener); } iv_avatar.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(mContext, ProfileActivity.class); if (getItemViewType(position) == TYPE_RECEIVER_TXT || getItemViewType(position) == TYPE_RECEIVER_IMAGE || getItemViewType(position) == TYPE_RECEIVER_LOCATION || getItemViewType(position) == TYPE_RECEIVER_VOICE) { intent.putExtra("from", "other"); intent.putExtra("username", item.getBelongUsername()); } else { intent.putExtra("from", "me"); } mContext.startActivity(intent); } }); tv_time.setText(TimeUtil.getChatTime(Long.parseLong(item.getMsgTime()))); if (getItemViewType(position) == TYPE_SEND_TXT // ||getItemViewType(position)==TYPE_SEND_IMAGE//图片单独处理 || getItemViewType(position) == TYPE_SEND_LOCATION || getItemViewType(position) == TYPE_SEND_VOICE) {//只有自己发送的消息才有重发机制 //状态描述 if (item.getStatus() == BmobConfig.STATUS_SEND_SUCCESS) {//发送成功 progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); if (item.getMsgType() == BmobConfig.TYPE_VOICE) { tv_send_status.setVisibility(View.GONE); tv_voice_length.setVisibility(View.VISIBLE); } else { tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已发送"); } } else if (item.getStatus() == BmobConfig.STATUS_SEND_FAIL) {//服务器无响应或者查询失败等原因造成的发送失败,均需要重发 progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.VISIBLE); tv_send_status.setVisibility(View.INVISIBLE); if (item.getMsgType() == BmobConfig.TYPE_VOICE) { tv_voice_length.setVisibility(View.GONE); } } else if (item.getStatus() == BmobConfig.STATUS_SEND_RECEIVERED) {//对方已接收到 progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); if (item.getMsgType() == BmobConfig.TYPE_VOICE) { tv_send_status.setVisibility(View.GONE); tv_voice_length.setVisibility(View.VISIBLE); } else { tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已阅读"); } } else if (item.getStatus() == BmobConfig.STATUS_SEND_START) {//开始上传 progress_load.setVisibility(View.VISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.INVISIBLE); if (item.getMsgType() == BmobConfig.TYPE_VOICE) { tv_voice_length.setVisibility(View.GONE); } } } //根据类型显示内容 final String text = item.getContent(); switch (item.getMsgType()) { case BmobConfig.TYPE_TEXT: try { SpannableString spannableString = FaceTextUtils .toSpannableString(mContext, text); tv_message.setText(spannableString); } catch (Exception e) { } break; case BmobConfig.TYPE_IMAGE://图片类 try { if (text != null && !text.equals("")) {//发送成功之后存储的图片类型的content和接收到的是不一样的 dealWithImage(position, progress_load, iv_fail_resend, tv_send_status, iv_picture, item); } iv_picture.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(mContext, ImageBrowserActivity.class); ArrayList<String> photos = new ArrayList<String>(); photos.add(getImageUrl(item)); intent.putStringArrayListExtra("photos", photos); intent.putExtra("position", 0); mContext.startActivity(intent); } }); } catch (Exception e) { } break; case BmobConfig.TYPE_LOCATION://位置信息 try { if (text != null && !text.equals("")) { String address = text.split("&")[0]; final String latitude = text.split("&")[1];//维度- final String longtitude = text.split("&")[2];//经度 tv_location.setText(address); tv_location.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(mContext, LocationActivity.class); intent.putExtra("type", "scan"); intent.putExtra("latitude", Double.parseDouble(latitude));//维度 intent.putExtra("longtitude", Double.parseDouble(longtitude));//经度 mContext.startActivity(intent); } }); } } catch (Exception e) { } break; case BmobConfig.TYPE_VOICE://语音消息 try { if (text != null && !text.equals("")) { tv_voice_length.setVisibility(View.VISIBLE); String content = item.getContent(); if (item.getBelongId().equals(currentObjectId)) {//发送的消息 if (item.getStatus() == BmobConfig.STATUS_SEND_RECEIVERED || item.getStatus() == BmobConfig.STATUS_SEND_SUCCESS) {//当发送成功或者发送已阅读的时候,则显示语音长度 tv_voice_length.setVisibility(View.VISIBLE); String length = content.split("&")[2]; tv_voice_length.setText(length + "\''"); } else { tv_voice_length.setVisibility(View.INVISIBLE); } } else {//收到的消息 boolean isExists = BmobDownloadManager.checkTargetPathExist(currentObjectId, item); if (!isExists) {//若指定格式的录音文件不存在,则需要下载,因为其文件比较小,故放在此下载 String netUrl = content.split("&")[0]; final String length = content.split("&")[1]; BmobDownloadManager downloadTask = new BmobDownloadManager(mContext, item, new DownloadListener() { @Override public void onStart() { // TODO Auto-generated method stub progress_load.setVisibility(View.VISIBLE); tv_voice_length.setVisibility(View.GONE); iv_voice.setVisibility(View.INVISIBLE);//只有下载完成才显示播放的按钮 } @Override public void onSuccess() { // TODO Auto-generated method stub progress_load.setVisibility(View.GONE); tv_voice_length.setVisibility(View.VISIBLE); tv_voice_length.setText(length + "\''"); iv_voice.setVisibility(View.VISIBLE); } @Override public void onError(String error) { progress_load.setVisibility(View.GONE); tv_voice_length.setVisibility(View.GONE); iv_voice.setVisibility(View.INVISIBLE); } }); downloadTask.execute(netUrl); } else { String length = content.split("&")[2]; tv_voice_length.setText(length + "\''"); } } } //播放语音文件 iv_voice.setOnClickListener(new NewRecordPlayClickListener(mContext, item, iv_voice)); } catch (Exception e) { } break; default: break; } return convertView; } /** * 获取图片的地址-- * * @param @param item * @param @return * @return String * @throws * @Description: TODO */ private String getImageUrl(BmobMsg item) { String showUrl = ""; String text = item.getContent(); if (item.getBelongId().equals(currentObjectId)) {// if (text.contains("&")) { showUrl = text.split("&")[0]; } else { showUrl = text; } } else {//如果是收到的消息,则需要从网络下载 showUrl = text; } return showUrl; } /** * 处理图片 * * @param @param position * @param @param progress_load * @param @param iv_fail_resend * @param @param tv_send_status * @param @param iv_picture * @param @param item * @return void * @throws * @Description: TODO */ private void dealWithImage(int position, final ProgressBar progress_load, ImageView iv_fail_resend, TextView tv_send_status, ImageView iv_picture, BmobMsg item) { String text = item.getContent(); if (getItemViewType(position) == TYPE_SEND_IMAGE) {//发送的消息 if (item.getStatus() == BmobConfig.STATUS_SEND_START) { progress_load.setVisibility(View.VISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.INVISIBLE); } else if (item.getStatus() == BmobConfig.STATUS_SEND_SUCCESS) { progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已发送"); } else if (item.getStatus() == BmobConfig.STATUS_SEND_FAIL) { progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.VISIBLE); tv_send_status.setVisibility(View.INVISIBLE); } else if (item.getStatus() == BmobConfig.STATUS_SEND_RECEIVERED) { progress_load.setVisibility(View.INVISIBLE); iv_fail_resend.setVisibility(View.INVISIBLE); tv_send_status.setVisibility(View.VISIBLE); tv_send_status.setText("已阅读"); } // 如果是发送的图片的话,因为开始发送存储的地址是本地地址,发送成功之后存储的是本地地址+"&"+网络地址,因此需要判断下 String showUrl = ""; if (text.contains("&")) { showUrl = text.split("&")[0]; } else { showUrl = text; } //为了方便每次都是取本地图片显示 ImageLoader.getInstance().displayImage(showUrl, iv_picture); } else { ImageLoader.getInstance().displayImage(text, iv_picture, ImageLoadOptions.getOptions(), new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { progress_load.setVisibility(View.VISIBLE); } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { progress_load.setVisibility(View.INVISIBLE); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // TODO Auto-generated method stub progress_load.setVisibility(View.INVISIBLE); } @Override public void onLoadingCancelled(String imageUri, View view) { progress_load.setVisibility(View.INVISIBLE); } }); } } private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } }