package com.kitty.poclient.fragment.store;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
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.ExpandableListView;
import android.widget.LinearLayout;
//import com.dfim.app.activity.TabWebActivity;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.PauseOnScrollListener;
import com.kitty.poclient.R;
import com.kitty.poclient.adapter.ColumnsListAdapter;
import com.kitty.poclient.common.Constant;
import com.kitty.poclient.common.ViewFactory;
import com.kitty.poclient.common.WatchDog;
import com.kitty.poclient.domain.Album;
import com.kitty.poclient.domain.Column;
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.BitmapUtil;
import com.kitty.poclient.util.JsonUtil;
import com.kitty.poclient.util.LoadImageAysnc.ImageCallBack;
public class TopsFragment extends Fragment implements NobleMan,TitlebarUpdateFragment,SelfReloader {
// Looper.prepare,Pools.execut
private final String TAG = "TopsFragment";
private Context context;
private View view;
private AnimationDrawable ad;
private LinearLayout llLoading;
private LinearLayout llContent;
private LinearLayout llNoData;
private ExpandableListView xlvTops;
private ColumnsListAdapter adapter;
private boolean fragmentIsActive = false;
private boolean loadingRunning = false;
private int firstVisibleItemPosition = 0;// 记录停止卷动时第一个ITEM的序号
private int lastVisibleItemPosition = 5;//
private int scrollTop = 0;// 记录停止卷动时第一个ITEM距离顶端的偏移量
private String uri = "";
private List<Column> tops = new ArrayList<Column>();
private final int MSG_TOPS_DATA_GOT = 0;
private final int MSG_NO_DATA = 1;
private final int MSG_LETS_GET_DATA = 2;
private final int MSG_ADAPTER_DATA_SET_CHANGED = 3;
private final int MSG_DATA_LOAD_FAILD = 4;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_TOPS_DATA_GOT:
updateUI();
break;
case MSG_NO_DATA:
llNoData.setVisibility(View.VISIBLE);
llLoading.setVisibility(View.GONE);
llContent.setVisibility(View.GONE);
break;
case MSG_LETS_GET_DATA:
// if (WatchDog.flagInBotiques == true) {
// getSavedDataAndPosition();
// } else {
// getTopsList();
// }
getTopsList();
break;
case MSG_ADAPTER_DATA_SET_CHANGED:
adapter.notifyDataSetChanged();
break;
case MSG_DATA_LOAD_FAILD:
uiShowNoData();
}
super.handleMessage(msg);
}
};
// private BroadcastReceiver fitTopsTitleReceier = new BroadcastReceiver() {
//
// @Override
// public void onReceive(Context context, Intent intent) {
// parentActivityChangeTitle();
// parentActivityChangeButton();
// }
// };
private void stopLoadingAnimation() {
if (ad != null && ad.isRunning()) {
ad.stop();
}
loadingRunning = false;
}
public void uiShowNoData() {
System.out.println(TAG+"showNoData");
stopLoadingAnimation();
llContent.setVisibility(View.GONE);
llLoading.setVisibility(View.GONE);
llNoData.setVisibility(View.VISIBLE);
View loadFailureView=new ViewFactory().createLoadFailureView(this);
llNoData.removeAllViews();
llNoData.addView(loadFailureView);
}
protected void updateUI() {
if (adapter != null) {
if (loadingRunning == true) {
endLoading();
}
adapter.notifyDataSetChanged();
for (int i = 0; i < adapter.getGroupCount(); i++) {
xlvTops.expandGroup(i);
}
xlvTops.setSelectionFromTop(firstVisibleItemPosition, scrollTop);
handler.sendMessageDelayed(handler.obtainMessage(MSG_ADAPTER_DATA_SET_CHANGED), 500);
}
}
public TopsFragment() {
}
public TopsFragment(Context context) {
this.context = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// parentActivityChangeButton();
// parentActivityChangeTitle();
updateTitlebar();
view = LayoutInflater.from(context).inflate(R.layout.tops_fragment, null);
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
initComponents();
startLoading();
getTopListWhenActive();
// registerReceivers();
return view;
}
// private void parentActivityChangeTitle() {
// TabWebActivity.tvTitle.setText("TOP100");
// TabWebActivity.currentMenuItem = "TOP100";
// ((TabWebActivity) context).useTitleStyle(TabWebActivity.TITLE_STYLE_NORMAL);
// }
//
// private void parentActivityChangeButton() {
// TabWebActivity.changeButton("btnMenu");
// }
private void getTopListWhenActive() {
new Thread(new Runnable() {
@Override
public void run() {
while (fragmentIsActive == false) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
handler.sendEmptyMessage(MSG_LETS_GET_DATA);
}
}).start();
}
@Override
public void onResume() {
// listViewGetFormerPosition();
WatchDog.currentSelfReloader = this;
fragmentIsActive = true;
super.onResume();
}
private void startLoading() {
Log.e(TAG, "startLoading()");
llContent.setVisibility(View.GONE);
llLoading.setVisibility(View.VISIBLE);
llNoData.setVisibility(View.GONE);
if (ad == null) {
ad = (AnimationDrawable) getResources().getDrawable(R.anim.animatior_list);
}
llLoading.findViewById(R.id.iv_loading).setBackgroundDrawable(ad);
ad.start();
loadingRunning = true;
}
protected void endLoading() {
if (ad != null && ad.isRunning()) {
ad.stop();
}
llContent.setVisibility(View.VISIBLE);
llLoading.setVisibility(View.GONE);
llNoData.setVisibility(View.GONE);
loadingRunning = false;
}
private void listViewGetFormerPosition() {
if (firstVisibleItemPosition != -1) {
xlvTops.setSelectionFromTop(firstVisibleItemPosition, scrollTop);
}
}
// private void parentActivityChangeTitle() {
// TabWebActivity.tvTitle.setText("TOP100");
// TabWebActivity.currentFragment = "TOP100";
// // TabWebActivity.slidingMenuInitOk = false;
// }
//
// private void parentActivityChangeButton() {
// TabWebActivity.changeButton("btnMenu");
// }
private void getTopsList() {
Pools.executorService1.submit(new Runnable() {
@Override
public void run() {
tops = new HttpGetter(context).getTopsList();
if (tops != null && tops.size() != 0) {
adapter.setColumns(tops);
// handler.sendEmptyMessage(MSG_TOPS_DATA_GOT);
// 下载每个子栏目的专辑列表
for (Column botique : tops) {
getTopAlbumList(botique);
}
// WatchDog.topsDataGot = true;
}
// else {
// handler.sendEmptyMessage(MSG_NO_DATA);
// }
}
});
}
protected void getTopAlbumList(final Column botique) {
Pools.executorService1.submit(new Runnable() {
@Override
public void run() {
String json = new HttpGetter(context).getColumnAlbumsList(botique, Constant.COLUMN_ALBUMS_4_TOPS);
ColumnDetail botiqueDetail = new JsonUtil().getColumnDetail(json);
botique.setDetail(botiqueDetail);
// 拿到栏目专辑列表后刷新界面
handler.sendEmptyMessage(MSG_TOPS_DATA_GOT);
/*
* // 下载每张专辑的封面图片 for (int i = 0; i <
* botiqueDetail.getAlbums().size(); i++) { //
* botiqueDetail.getAlbums
* ().get(i).setCoverBitmap(Constant.albumCover);
* downloadImage(botiqueDetail.getAlbums().get(i)); }
*/
}
});
}
protected void downloadImage(final Album album) {
Pools.executorService2.submit(new Runnable() {
@Override
public void run() {
// Looper.prepare();
String imageKey = album.getImgUrl() + "150";
Bitmap bitmap = BitmapUtil.loadImageAysnc.loadImageNohandler(imageKey, album.getImgUrl(), 150, false, new ImageCallBack() {
@Override
public void imageLoaded(Bitmap bitmap) {
if (bitmap != null && !bitmap.isRecycled()) {
album.setBitmap(new SoftReference<Bitmap>(bitmap));
handler.sendEmptyMessage(MSG_TOPS_DATA_GOT);
}
}
});
// 得到封面后刷新界面
if (bitmap != null && !bitmap.isRecycled()) {
album.setBitmap(new SoftReference<Bitmap>(bitmap));
handler.sendEmptyMessage(MSG_TOPS_DATA_GOT);
}
bitmap = null;
// Looper.loop();
}
});
}
private void initComponents() {
llLoading = (LinearLayout) view.findViewById(R.id.ll_loading);
llContent = (LinearLayout) view.findViewById(R.id.ll_content);
llNoData = (LinearLayout) view.findViewById(R.id.ll_no_data);
// 初始化expandableListView
xlvTops = (ExpandableListView) view.findViewById(R.id.xlv_tops);
initExpandableListView();
}
@Override
public void onDetach() {
// unregisterReceivers();
if (tops != null && tops.size() != 0) {
recycleBitmaps();
}
super.onDetach();
}
private void registerReceivers() {
// context.registerReceiver(fitTopsTitleReceier, new IntentFilter("fitTopsTitleReceier"));
}
private void initArguments() {
}
private void initExpandableListView() {
xlvTops.setGroupIndicator(null);
xlvTops.setItemsCanFocus(true);
xlvTops.setOnGroupClickListener(null);
adapter = new ColumnsListAdapter(getActivity(), tops, xlvTops, this);
xlvTops.setAdapter(adapter);
xlvTops.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, true){
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
firstVisibleItemPosition = xlvTops.getFirstVisiblePosition();
lastVisibleItemPosition = xlvTops.getLastVisiblePosition();
super.onScrollStateChanged(view, scrollState);
}
});
/* xlvTops.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
firstVisibleItemPosition = xlvTops.getFirstVisiblePosition();
lastVisibleItemPosition = xlvTops.getLastVisiblePosition();
if (xlvTops.getChildAt(0) != null) {
scrollTop = xlvTops.getChildAt(0).getTop();
}
paintAlbumsWithinSightNFreeOthers();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});*/
}
protected void paintAlbumsWithinSightNFreeOthers() {
for (int i = 0; i < tops.size(); i++) {
if (2 * i + 1 >= firstVisibleItemPosition && 2 * i - 1 <= lastVisibleItemPosition) {
downloadColumnImage(tops.get(i));
} else {
FreeColumnImage(tops.get(i));
}
}
}
private void FreeColumnImage(Column column) {
if (column.getDetail() == null || column.getDetail().getAlbums() == null) {
return;
}
for (Album album : column.getDetail().getAlbums()) {// null pointer
freeImage(album);
}
}
private void freeImage(Album album) {
Bitmap bitmap = album.getBitmap();
if (bitmap != null && !bitmap.equals(Constant.albumCover)) {
bitmap.recycle();
bitmap = null;
}
}
private void downloadColumnImage(Column column) {
if (column.getDetail() == null || column.getDetail().getAlbums() == null) {
return;
}
for (Album album : column.getDetail().getAlbums()) {
downloadImage(album);
}
}
private void unregisterReceivers() {
// context.unregisterReceiver(fitTopsTitleReceier);
}
@Override
public void letsSeeHeaven() {
// TODO Auto-generated method stub
}
@Override
public void recordCurrentDataAndPosition() {
WatchDog.columnsInTops = tops;
WatchDog.fvipInTops = firstVisibleItemPosition;
// WatchDog.lvipInBotiques = lastVisibleItemPosition;
WatchDog.stInTops = scrollTop;
WatchDog.flagInTops = true;
}
@Override
public void getSavedDataAndPosition() {
tops = WatchDog.columnsInTops;
firstVisibleItemPosition = WatchDog.fvipInTops;
scrollTop = WatchDog.stInTops;
handler.sendEmptyMessage(MSG_TOPS_DATA_GOT);
WatchDog.flagInTops = false;
WatchDog.columnsInTops = null;
}
@Override
public int getFistVisiblePosition() {
return firstVisibleItemPosition;
}
@Override
public int getLastVisiblePosition() {
return lastVisibleItemPosition;
}
@Override
public void recycleBitmaps() {
for (Column column : tops) {
if (column.getDetail() == null || column.getDetail().getAlbums() == null) {
continue;
}
for (Album album : column.getDetail().getAlbums()) {
album.recyleBitmap();
}
}
}
@Override
public void updateTitlebar() {
WatchDog.tabWebFragment.setPopbackable(false);
WatchDog.tabWebFragment.setTitle("TOP100");
WatchDog.tabWebFragment.currentMenuItem = "TOP100";
}
@Override
public void reload() {
System.out.println(TAG+"reloading...");
startLoading();
getTopListWhenActive();
}
@Override
public void onDataLoadFailed() {
handler.sendEmptyMessage(MSG_DATA_LOAD_FAILD);
}
}