package com.kitty.poclient.fragment.store;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.PauseOnScrollListener;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.kitty.poclient.R;
import com.kitty.poclient.common.Constant;
import com.kitty.poclient.common.UpnpApp;
import com.kitty.poclient.common.ViewFactory;
import com.kitty.poclient.common.WatchDog;
import com.kitty.poclient.domain.Album;
import com.kitty.poclient.domain.ColumnDetail;
import com.kitty.poclient.fragment.TabWebFragment.TitlebarUpdateFragment;
import com.kitty.poclient.http.HttpGetter;
import com.kitty.poclient.interfaces.NobleMan;
import com.kitty.poclient.interfaces.SelfReloader;
import com.kitty.poclient.thread.Pools;
import com.kitty.poclient.util.AnimUtil;
import com.kitty.poclient.util.JsonUtil;
import com.kitty.poclient.util.PowerfulBigMan;
//notifyData,Looper.prepare,null",Log.e
public class TopDetailFragment extends Fragment implements NobleMan, TitlebarUpdateFragment, SelfReloader {
private final String TAG = "ColumnDetailFragment139: ";
private Context context;
/*
* 控件
*/
private View view;
private LinearLayout llLoading;
private LinearLayout llNoData;
private LinearLayout llDataLoadFailed;
private RelativeLayout rlContent;
private ListView lvAlbums;
private LinearLayout llLoadingMore;
private TopAlbumListAdapter adapter;
/*
* 数据
*/
public ColumnDetail columnDetail;
private List<Album> albums = new ArrayList<Album>();
private String columnName = "";
private long columnId = -1L;
private int firstVisibleItemPosition = 0;// 记录停止卷动时第一个ITEM的序号
private int lastVisibleItemPosition = 14;// 记录停止卷动时最后一个ITEM的序号
private int scrollTop = 0;// 记录停止卷动时第一个ITEM距离顶端的偏移量
private boolean isGettingMore = false;
private boolean isGettingData = false;
private boolean dataLoadFinished = false;
private static final int ALBUMCOVER_FADEIN_INTERVAL_MILLIS = 1000;
/*
* 刷新界面
*/
private final int MSG_IMG_GOT = 0;
private final int MSG_ALBUMS_GOT = 1;
private final int MSG_DATA_LOAD_FAILD = 2;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_IMG_GOT:
if (adapter != null) {
// endLoading();
adapter.notifyDataSetChanged();
}
break;
case MSG_ALBUMS_GOT:
if (albums != null && albums.size() != 0) {
endLoading();
// printAlbums(adapter.getDataAlbums());
adapter.notifyDataSetChanged();
if (!isGettingMore) {
lvAlbums.setSelectionFromTop(firstVisibleItemPosition, scrollTop);
} else {
isGettingMore = false;
}
hideLoadingAnimation();
} else if (albums != null && albums.size() == 0) {
showNoData();
}
isGettingData = false;
break;
case MSG_DATA_LOAD_FAILD:
uiShowDataLoadFailed();
break;
}
super.handleMessage(msg);
}
};
// private BroadcastReceiver fitBotiqueDetailTitleReceier = new BroadcastReceiver() {
//
// @Override
// public void onReceive(Context context, Intent intent) {
// parentActivityChangeTitle();
// parentActivityChangeButton("btnBack");
// }
// };
public TopDetailFragment() {
}
public void letsSeeHeaven() {
for (int i = 6; i < albums.size(); i++) {
albums.get(i).recyleBitmap();
}
albums = null;
columnDetail = null;
}
protected void showNoData() {
Log.e("BUG953", TAG + "showNoData");
llLoading.setVisibility(View.GONE);
rlContent.setVisibility(View.GONE);
// gvAlbums.setVisibility(View.GONE);
llDataLoadFailed.setVisibility(View.GONE);
llNoData.setVisibility(View.VISIBLE);
}
protected void uiShowDataLoadFailed() {
Log.e("BUG953", TAG + "uiShowDataLoadFailed");
rlContent.setVisibility(View.GONE);
// gvAlbums.setVisibility(View.GONE);
llLoading.setVisibility(View.GONE);
llNoData.setVisibility(View.GONE);
llDataLoadFailed.setVisibility(View.VISIBLE);
View loadFailureView = new ViewFactory().createLoadFailureView(this);
llDataLoadFailed.removeAllViews();
llDataLoadFailed.addView(loadFailureView);
}
public TopDetailFragment(Context context, ColumnDetail botiqueDetail, long botiqueId, String botiqueName) {
this.context = context;
this.columnId = botiqueId;
this.columnName = botiqueName;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.e(TAG, "onCreateView()");
updateTitlebar();
view = LayoutInflater.from(UpnpApp.context).inflate(R.layout.top_detail, null);
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
initComponents();
initLvAlbums();
initLoadingmoreAnim();
startLoading();
if (WatchDog.flagInTopDetail == true) {
getSavedDataAndPosition();
} else {
getData(0, Constant.COLUMN_DETAIL_ITEMS_COUNT_PER_PAGE);
}
return view;
}
private void initLoadingmoreAnim() {
ImageView ivAnim = (ImageView) llLoadingMore.findViewById(R.id.iv_loading_more);
new AnimUtil(context).initLoadingmoreAnim(ivAnim);
}
@Override
public void onResume() {
super.onResume();
WatchDog.currentSelfReloader = this;
}
private void startLoading() {
llLoading.setVisibility(View.VISIBLE);
llNoData.setVisibility(View.GONE);
rlContent.setVisibility(View.GONE);
// gvAlbums.setVisibility(View.GONE);
llDataLoadFailed.setVisibility(View.GONE);
AnimationDrawable ad = (AnimationDrawable) getResources().getDrawable(R.anim.animatior_list);
llLoading.findViewById(R.id.iv_loading).setBackgroundDrawable(ad);
ad.start();
}
protected void endLoading() {
llLoading.setVisibility(View.GONE);
llNoData.setVisibility(View.GONE);
llDataLoadFailed.setVisibility(View.GONE);
rlContent.setVisibility(View.VISIBLE);
// gvAlbums.setVisibility(View.VISIBLE);
}
// private void parentActivityChangeTitle() {
// TabWebActivity.tvTitle.setText(columnName);
// // TabWebActivity.currentFragment = "精品聚焦-精品详情";
// }
//
// private void parentActivityChangeButton(String which) {
// TabWebActivity.changeButton(which);
// }
private void initComponents() {
llLoading = (LinearLayout) view.findViewById(R.id.ll_loading);
llNoData = (LinearLayout) view.findViewById(R.id.ll_no_data);
llDataLoadFailed = (LinearLayout) view.findViewById(R.id.ll_dataload_failed);
rlContent = (RelativeLayout) view.findViewById(R.id.rl_content);
llLoadingMore = (LinearLayout) rlContent.findViewById(R.id.ll_loading_anim);
}
private void initLvAlbums() {
lvAlbums = (ListView) view.findViewById(R.id.lv_albums);
adapter = new TopAlbumListAdapter();
adapter.setDataAlbums(albums);
lvAlbums.setAdapter(adapter);
lvAlbums.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), false, true) {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem + visibleItemCount >= totalItemCount) {// 如果当前页已见底
// 或获取更多数据
if (columnDetail != null && albums.size() < columnDetail.getTotal() && !isGettingData) {
// 显示加载动画
showLoadingAnimation();
getData(albums.size(), 30);
isGettingData = true;
isGettingMore = true;
}
// 或标记加载已完毕
else if (columnDetail != null && albums.size() >= columnDetail.getTotal()) {
if (!dataLoadFinished) {
dataLoadFinished = true;
}
}
}
super.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
@Override
// 卷动状态发生变化(滑动中-停止中-甩动中)
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE) {// 如果当前状态为停止中
// 获取可见头,可见尾
firstVisibleItemPosition = lvAlbums.getFirstVisiblePosition();
lastVisibleItemPosition = lvAlbums.getLastVisiblePosition();
if (lvAlbums.getChildAt(0) != null) {
scrollTop = lvAlbums.getChildAt(0).getTop();
}
// 如果可见尾等于数据总长度,提示“加载完成”
if (lastVisibleItemPosition >= columnDetail.getTotal() - 1) {
showDataLoadFinishedMsg();
}
}
super.onScrollStateChanged(view, scrollState);
}
});
lvAlbums.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
if (PowerfulBigMan.testClickInterval() == false) {
return;
}
recordCurrentDataAndPosition();//在跳转之前记录数据和位置
Album album=albums.get(position);
WatchDog.tabWebFragment.showAlbumContent(album.getId(), album.getName(), album.getImgUrl());
}
});
}
protected void showLoadingAnimation() {
llLoadingMore.setVisibility(View.VISIBLE);
}
protected void hideLoadingAnimation() {
// 强制用户多观赏一会动画
handler.postDelayed(new Runnable() {
@Override
public void run() {
llLoadingMore.setVisibility(View.GONE);
}
}, 500);
}
protected void showDataLoadFinishedMsg() {
UpnpApp.mainHandler.showInfo(R.string.data_load_finished);
}
class Holder {
private TextView tvNum;
private TextView tvName;
private TextView tvArtist;
private ImageView ivAlbumCover;
Holder(View convertView) {
tvNum = (TextView) convertView.findViewById(R.id.tv_num);
tvName = (TextView) convertView.findViewById(R.id.tv_album_name);
tvArtist = (TextView) convertView.findViewById(R.id.tv_album_artist);
ivAlbumCover = (ImageView) convertView.findViewById(R.id.iv_album_cover);
}
}
public void getData(final int startItem, final int maxItems) {
// 开线程获取数据
Pools.executorService1.submit(new Runnable() {
@Override
public void run() {
String json = new HttpGetter(context).getColumnAlbumsList(columnId, columnName, startItem, maxItems);
if (!(new JsonUtil().validate(json))) {
return;
} else {
columnDetail = new JsonUtil().getColumnDetail(json);
if (startItem == 0) {
albums.clear();
}
albums.addAll(columnDetail.getAlbums());
handler.sendEmptyMessage(MSG_ALBUMS_GOT);
}
}
});
}
@Override
public void onDetach() {
unregisterReceivers();
recycleBitmaps();
super.onDetach();
}
private void registerReceivers() {
// context.registerReceiver(fitBotiqueDetailTitleReceier, new IntentFilter("fitBotiqueDetailTitleReceier"));
}
private void unregisterReceivers() {
}
public void recordCurrentDataAndPosition() {
WatchDog.albumsInTopDetail = albums;
WatchDog.fvipInTopDetail = firstVisibleItemPosition;
WatchDog.lvipInTopDetail = lastVisibleItemPosition;
WatchDog.stInTopDetail = scrollTop;
WatchDog.flagInTopDetail = true;
}
public void getSavedDataAndPosition() {
albums = WatchDog.albumsInTopDetail;
adapter.setDataAlbums(albums);
// printAlbums(albums);
firstVisibleItemPosition = WatchDog.fvipInTopDetail;
lastVisibleItemPosition = WatchDog.lvipInTopDetail;
scrollTop = WatchDog.stInTopDetail;
handler.sendEmptyMessage(MSG_ALBUMS_GOT);
WatchDog.flagInTopDetail = false;
WatchDog.albumsInTopDetail = null;// ?
}
private void printAlbums(List<Album> _albums) {
for (Album album : _albums) {
Log.e(TAG, album.getName());
}
}
@Override
public int getFistVisiblePosition() {
return -1;
}
@Override
public int getLastVisiblePosition() {
return -1;
}
@Override
public void recycleBitmaps() {
}
@Override
public void updateTitlebar() {
WatchDog.tabWebFragment.setPopbackable(true);
WatchDog.tabWebFragment.setTitle(columnName);
}
@Override
public void onDataLoadFailed() {
Log.e("BUG953", TAG + "onDataLoadFailed");
handler.sendEmptyMessage(MSG_DATA_LOAD_FAILD);
}
@Override
public void reload() {
Log.e("BUG953", TAG + "reload");
startLoading();
getData(0, Constant.COLUMN_DETAIL_ITEMS_COUNT_PER_PAGE);
}
class TopAlbumListAdapter extends BaseAdapter {
private List<Album> dataAlbums;
private ImageLoader loader;
private DisplayImageOptions options;
private ImageLoadingListener animateFirstListener;
private int color1, color2, colorOther;
public TopAlbumListAdapter() {
dataAlbums = new ArrayList<Album>();
loader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.pic).cacheInMemory(true).cacheOnDisc(true).considerExifParams(true).bitmapConfig(Bitmap.Config.RGB_565).build();
animateFirstListener = new MyImageLoadingListener();
color1 = getResources().getColor(R.color.top_1_textcolor);
color2 = getResources().getColor(R.color.top_2_textcolor);
colorOther = getResources().getColor(R.color.top_other_textcolor);
}
public List<Album> getDataAlbums() {
return dataAlbums;
}
public void setDataAlbums(List<Album> dataAlbums) {
this.dataAlbums = dataAlbums;
}
@Override
public int getCount() {
return dataAlbums.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@SuppressLint("ResourceAsColor")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if (convertView == null || convertView.getTag() == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.top_detail_item, null);
holder = new Holder(convertView);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}
// 设置排名字体颜色
switch (position) {
case 0:
holder.tvNum.setTextColor(color1);
break;
case 1:
holder.tvNum.setTextColor(color2);
break;
case 2:
holder.tvNum.setTextColor(color2);
break;
default:
holder.tvNum.setTextColor(colorOther);
break;
}
// 设置文本
holder.tvNum.setText((position + 1) + "");
holder.tvName.setText(dataAlbums.get(position).getName());
holder.tvArtist.setText(dataAlbums.get(position).getArtistli().get(0).getName());
// 设置图片
String imgUrl = dataAlbums.get(position).getImgUrl();
loader.displayImage(imgUrl, holder.ivAlbumCover, options, animateFirstListener);
return convertView;
}
}
/**
* 使用动画
*/
private static class MyImageLoadingListener extends SimpleImageLoadingListener {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage != null) {
ImageView imageView = (ImageView) view;
// 图片淡入效果
FadeInBitmapDisplayer.animate(imageView, ALBUMCOVER_FADEIN_INTERVAL_MILLIS);
}
}
}
}