package com.suan.weclient.adapter;
import android.app.Activity;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.suan.weclient.R;
import com.suan.weclient.util.ListCacheManager;
import com.suan.weclient.util.Util;
import com.suan.weclient.util.data.DataManager;
import com.suan.weclient.util.data.bean.AppItemBean;
import com.suan.weclient.util.data.bean.MaterialBean;
import com.suan.weclient.util.data.bean.MultiItemBean;
import com.suan.weclient.util.net.WeChatLoader;
import com.suan.weclient.util.net.WechatManager;
import com.suan.weclient.util.net.WechatManager.OnActionFinishListener;
import com.suan.weclient.util.net.images.ImageCacheManager;
import com.suan.weclient.util.voice.VoiceHolder;
import com.suan.weclient.util.voice.VoiceManager.AudioPlayListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class MaterialListAdapter extends BaseAdapter implements OnScrollListener {
private LayoutInflater mInflater;
private ListCacheManager mListCacheManager;
private DataManager mDataManager;
private Activity mActivity;
/*
* whether the scroll is busy
*/
private boolean mBusy = false;
private int selectedPosition = -1;
private ItemViewHolder selectedHolder;
public MaterialListAdapter(Activity activity, DataManager dataManager) {
this.mInflater = LayoutInflater.from(activity);
this.mDataManager = dataManager;
this.mActivity = activity;
this.mListCacheManager = new ListCacheManager();
}
private ArrayList<MaterialBean> getMaterialBeans() {
if (mDataManager.getUserGroup().size() == 0) {
ArrayList<MaterialBean> blankArrayList = new ArrayList<MaterialBean>();
return blankArrayList;
}
return mDataManager.getMaterialHolder().getMaterialBeans();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return getMaterialBeans().size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public void updateCache() {
mListCacheManager.clearData();
}
public View newView(final int position) {
View convertView = null;
switch (getMaterialBeans().get(position).getType()) {
case MaterialBean.MATERIAL_TYPE_IMG:
convertView = mInflater.inflate(R.layout.material_item_img_layout,
null);
break;
case MaterialBean.MATERIAL_TYPE_VOICE:
convertView = mInflater.inflate(R.layout.material_item_voice_layout,
null);
break;
case MaterialBean.MATERIAL_TYPE_APP:
convertView = mInflater.inflate(R.layout.material_item_app_layout,
null);
break;
default:
convertView = mInflater.inflate(R.layout.material_item_img_layout,
null);
break;
}
return convertView;
}
private ItemViewHolder getHolder(final View view, int position) {
ItemViewHolder holder = (ItemViewHolder) view.getTag();
if (holder == null) {
holder = new ItemViewHolder(view, position);
view.setTag(holder);
}
return holder;
}
public class ItemViewHolder {
private View parentView;
private TextView nameTextView;
private TextView sizeTextView;
private TextView timeTextView;
private LinearLayout contentLayout;
private ImageView contentImageView;
private RelativeLayout voicePlayLayout;
private TextView voiceInfoTextView;
private ImageView voicePlayView;
/*
about app msg
*/
private RelativeLayout coverLayout;
private RelativeLayout[] itemLayout;
private ImageView coverImageView;
private ImageView[] itemImageView;
private TextView titleTextView;
private TextView coverTextView;
private TextView[] itemTextView;
/*
about data
*/
private MaterialBean materialBean;
private boolean dataLoaded = false;
private Object data;
public boolean getDataLoaded() {
return dataLoaded;
}
public void setDataLoaded(boolean dataLoaded) {
this.dataLoaded = dataLoaded;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public MaterialBean getMaterialBean() {
return materialBean;
}
public ItemViewHolder(View parentView, final int position) {
this.parentView = parentView;
this.materialBean = getMaterialBeans().get(position);
switch (materialBean.getType()) {
case MaterialBean.MATERIAL_TYPE_IMG:
nameTextView = (TextView) parentView.findViewById(R.id.material_item_text_name);
sizeTextView = (TextView) parentView.findViewById(R.id.material_item_text_size);
timeTextView = (TextView) parentView.findViewById(R.id.material_item_text_time);
contentLayout = (LinearLayout) parentView.findViewById(R.id.material_item_layout_content);
contentImageView = (ImageView) parentView.findViewById(R.id.material_item_img_img_content);
break;
case MaterialBean.MATERIAL_TYPE_VOICE:
nameTextView = (TextView) parentView.findViewById(R.id.material_item_text_name);
sizeTextView = (TextView) parentView.findViewById(R.id.material_item_text_size);
timeTextView = (TextView) parentView.findViewById(R.id.material_item_text_time);
contentLayout = (LinearLayout) parentView.findViewById(R.id.material_item_layout_content);
voicePlayLayout = (RelativeLayout) parentView.findViewById(R.id.material_item_voi_layout_play);
voicePlayView = (ImageView) parentView.findViewById(R.id.material_item_voi_button_play);
voiceInfoTextView = (TextView) parentView.findViewById(R.id.material_item_voi_text_info);
break;
case MaterialBean.MATERIAL_TYPE_APP:
titleTextView = (TextView) parentView.findViewById(R.id.material_item_app_text_title);
timeTextView = (TextView) parentView.findViewById(R.id.material_item_text_time);
coverLayout = (RelativeLayout) parentView.findViewById(R.id.material_item_app_layout_cover);
itemLayout = new RelativeLayout[3];
itemImageView = new ImageView[3];
itemTextView = new TextView[3];
itemLayout[0] = (RelativeLayout) parentView.findViewById(R.id.material_item_app_layout_first_item);
itemLayout[1] = (RelativeLayout) parentView.findViewById(R.id.material_item_app_layout_second_item);
itemLayout[2] = (RelativeLayout) parentView.findViewById(R.id.material_item_app_layout_third_item);
coverImageView = (ImageView) parentView.findViewById(R.id.material_item_app_img_cover);
itemImageView[0] = (ImageView) parentView.findViewById(R.id.material_item_app_img_first);
itemImageView[1] = (ImageView) parentView.findViewById(R.id.material_item_app_img_second);
itemImageView[2] = (ImageView) parentView.findViewById(R.id.material_item_app_img_third);
coverTextView = (TextView) parentView.findViewById(R.id.material_item_app_text_cover_title);
itemTextView[0] = (TextView) parentView.findViewById(R.id.material_item_app_text_first_title);
itemTextView[1] = (TextView) parentView.findViewById(R.id.material_item_app_text_second_title);
itemTextView[2] = (TextView) parentView.findViewById(R.id.material_item_app_text_third_title);
break;
default:
nameTextView = (TextView) parentView.findViewById(R.id.material_item_text_name);
sizeTextView = (TextView) parentView.findViewById(R.id.material_item_text_size);
timeTextView = (TextView) parentView.findViewById(R.id.material_item_text_time);
break;
}
}
}
public void bindView(View view, final int position) {
ItemViewHolder holder = getHolder(view, position);
MaterialBean materialBean = holder.getMaterialBean();
switch (materialBean.getType()) {
case MaterialBean.MATERIAL_TYPE_IMG:
setImgMessageContent(holder);
break;
case MaterialBean.MATERIAL_TYPE_VOICE:
setVoiceMessageContent(holder);
break;
case MaterialBean.MATERIAL_TYPE_APP:
setAPPMessageContent(holder);
break;
default:
break;
}
if (position == selectedPosition) {
holder.parentView.setActivated(true);
selectedHolder = holder;
} else {
holder.parentView.setActivated(false);
}
holder.parentView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setActivated(true);
selectedPosition = position;
notifyDataSetChanged();
}
});
if (materialBean.getType() == MaterialBean.MATERIAL_TYPE_IMG ||
materialBean.getType() == MaterialBean.MATERIAL_TYPE_VOICE) {
holder.nameTextView.setText(materialBean.getName());
String sizeString = "" + materialBean.getSize();
holder.sizeTextView.setText(sizeString);
long time = Long.parseLong(materialBean.getUpdate_time());
Date date = new Date(time * 1000);
SimpleDateFormat format = new SimpleDateFormat("MM.dd HH:mm ");
String timeString = "" + format.format(date);
holder.timeTextView.setText(timeString);
}
}
public void setAPPMessageContent(final ItemViewHolder holder) {
AppItemBean appItemBean = holder.getMaterialBean().getAppItemBean();
int itemCount = appItemBean.getMulti_item().size();
holder.coverTextView.setText(appItemBean.getDigest());
holder.titleTextView.setText(appItemBean.getTitle());
Bitmap contentBitmap = mDataManager.getCacheManager().getBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMaterialBean().getAppItemBean().getFile_id());
if (contentBitmap == null) {
mDataManager.getWechatManager().getNormalImg(mDataManager.getCurrentPosition(),
Util.checkImgUrl(holder.getMaterialBean().getAppItemBean().getImg_url()), holder.coverImageView, new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
if (code == WechatManager.ACTION_SUCCESS) {
if (object != null) {
Bitmap bitmap = (Bitmap) object;
mDataManager.getCacheManager().putBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMaterialBean().getAppItemBean().getFile_id(),
bitmap, true);
holder.coverImageView.setImageBitmap(bitmap);
}
}
}
});
} else {
holder.coverImageView.setImageBitmap(contentBitmap);
}
for (int i = 0; i < 3; i++) {
if (i < itemCount - 1) {
holder.itemLayout[i].setVisibility(View.VISIBLE);
holder.itemTextView[i].setText(appItemBean.getMulti_item().get(i + 1).getTitle() );
setAppItemImg(i, holder);
} else {
holder.itemLayout[i].setVisibility(View.GONE);
}
}
}
private void setAppItemImg(final int index, final ItemViewHolder holder) {
MultiItemBean multiItemBean = holder.getMaterialBean().getAppItemBean().getMulti_item().get(index);
Bitmap contentBitmap = mDataManager.getCacheManager().getBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ multiItemBean.getFile_id());
if (contentBitmap == null) {
mDataManager.getWechatManager().getNormalImg(mDataManager.getCurrentPosition(),
Util.checkImgUrl(multiItemBean.getCover()), holder.itemImageView[index], new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
if (code == WechatManager.ACTION_SUCCESS) {
if (object != null) {
Bitmap bitmap = (Bitmap) object;
mDataManager.getCacheManager().putBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMaterialBean().getAppItemBean().getMulti_item().get(index).getFile_id(),
bitmap, true);
holder.itemImageView[index].setImageBitmap(bitmap);
}
}
}
});
} else {
holder.itemImageView[index].setImageBitmap(contentBitmap);
}
}
public ItemViewHolder getSelectedHolder() {
return selectedHolder;
}
private void setVoiceMessageContent(final ItemViewHolder holder) {
if (!mBusy && !holder.getDataLoaded()) {
mDataManager.getWechatManager().getMaterialVoice(
mDataManager.getCurrentPosition(),
holder.getMaterialBean(),
mDataManager.getCurrentUser(),
new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
if (code == WechatManager.ACTION_SUCCESS) {
if (object != null) {
byte[] bytes = (byte[]) object;
VoiceHolder voiceHolder = new VoiceHolder(
bytes, holder.getMaterialBean().getPlay_length(),
bytes.length + "");
int playLength = Integer.parseInt(holder.getMaterialBean().getPlay_length());
int seconds = playLength / 1000;
int minutes = seconds / 60;
int leaveSecond = seconds % 60;
String info = "";
if (minutes != 0) {
info += minutes + "'";
}
info += " " + leaveSecond + "'";
holder.voiceInfoTextView.setText(info);
holder.setData(voiceHolder);
holder.setDataLoaded(true);
}
}
}
});
}
holder.voicePlayLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.getDataLoaded()) {
final VoiceHolder voiceHolder = (VoiceHolder) holder.getData();
if (voiceHolder.getPlaying()) {
mDataManager.getVoiceManager().stopMusic();
} else {
mDataManager.getVoiceManager().playVoice(
voiceHolder.getBytes(),
voiceHolder.getPlayLength(),
voiceHolder.getLength(),
new AudioPlayListener() {
@Override
public void onAudioStop() {
// TODO Auto-generated method stub
voiceHolder.setPlaying(false);
holder.voicePlayView.setSelected(false);
}
@Override
public void onAudioStart() {
// TODO Auto-generated method stub
voiceHolder.setPlaying(true);
holder.voicePlayView.setSelected(true);
}
@Override
public void onAudioError() {
// TODO Auto-generated method stub
}
});
}
} else {
}
}
});
}
private void setImgMessageContent(final ItemViewHolder holder) {
if (!mBusy && !holder.getDataLoaded()) {
Bitmap contentBitmap = mDataManager.getCacheManager().getBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMaterialBean().getFile_id());
if (contentBitmap == null) {
mDataManager.getWechatManager().getMaterialImg(
mDataManager.getCurrentPosition(),
holder.getMaterialBean(),
holder.contentImageView,
WeChatLoader.WECHAT_URL_MESSAGE_IMG_SMALL,
new OnActionFinishListener() {
@Override
public void onFinish(int code, Object object) {
// TODO Auto-generated method stub
if (code == WechatManager.ACTION_SUCCESS) {
if (object != null) {
Bitmap bitmap = (Bitmap) object;
mDataManager.getCacheManager().putBitmap(
ImageCacheManager.CACHE_MESSAGE_CONTENT
+ holder.getMaterialBean().getFile_id(),
bitmap, true);
holder.contentImageView.setImageBitmap(bitmap);
holder.setData(bitmap);
holder.setDataLoaded(true);
}
}
}
});
} else {
holder.contentImageView.setImageBitmap(contentBitmap);
holder.setData(contentBitmap);
holder.setDataLoaded(true);
}
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v;
if (!mListCacheManager.containView(getMaterialBeans().get(position).getFile_id()) ||
getMaterialBeans().get(position).getType() == MaterialBean.MATERIAL_TYPE_APP) {
v = newView(position);
mListCacheManager.putView(v, getMaterialBeans().get(position).getFile_id());
} else {
v = mListCacheManager.getView(getMaterialBeans().get(position).getFile_id());
}
// v = newView(position);
bindView(v, position);
return v;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { // 滑动停止
mBusy = false;
loadData(view);
} else if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {// 滑动手未松开
mBusy = true;
} else if (scrollState == OnScrollListener.SCROLL_STATE_FLING) {// 滑动中手已松开
mBusy = true;
}
}
private void loadData(AbsListView fatherView) {
for (int i = 0; i < fatherView.getChildCount(); i++) {
View nowView = fatherView.getChildAt(i);
if (nowView.getTag() != null) {
ItemViewHolder holder = (ItemViewHolder) nowView.getTag();
if (!holder.getDataLoaded()) {
MaterialBean materialBean = holder.materialBean;
switch (materialBean.getType()) {
case MaterialBean.MATERIAL_TYPE_IMG:
setImgMessageContent(holder);
break;
case MaterialBean.MATERIAL_TYPE_VOICE:
setVoiceMessageContent(holder);
break;
case MaterialBean.MATERIAL_TYPE_APP:
setAPPMessageContent(holder);
break;
}
}
}
}
}
}