package com.kitty.poclient.fragment.store; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.List; 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.ExpandableListView; import android.widget.LinearLayout; 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 GenresFragment extends Fragment implements NobleMan, TitlebarUpdateFragment,SelfReloader { // Looper.prepare private final String TAG = "GenresFragment"; private Context context; private View view; private LinearLayout llLoading; private LinearLayout llNoData; private LinearLayout llContent; private ExpandableListView xlvGenres; private ColumnsListAdapter adapter; private AnimationDrawable ad; private int firstVisibleItemPosition = 0;// 记录停止卷动时第一个ITEM的序号 private int lastVisibleItemPosition = 5;// 记录停止卷动时第一个ITEM的序号 private int scrollTop = 0;// 记录停止卷动时第一个ITEM距离顶端的偏移量 private boolean loadingRunning = false; private boolean fragmentIsActive = false; private String uri = ""; private List<Column> genres = new ArrayList<Column>(); // private BroadcastReceiver fitGenresTitleReceier = new BroadcastReceiver() { // // @Override // public void onReceive(Context context, Intent intent) { // parentActivityChangeTitle(); // parentActivityChangeButton(); // } // }; private final int MSG_GENRES_DATA_GOT = 0; private final int MSG_LETS_GET_DATA = 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_GENRES_DATA_GOT: updateUI(); break; case MSG_LETS_GET_DATA: // if (WatchDog.flagInBotiques == true) { // getSavedDataAndPosition(); // } else { // getColumnsList(); // } getColumnsList(); break; case MSG_DATA_LOAD_FAILD: uiShowNoData(); } super.handleMessage(msg); } }; private void getColumnsList() { Pools.executorService1.submit(new Runnable() { @Override public void run() { genres = new HttpGetter(context).getGenresList(); if (genres != null && genres.size() != 0) { adapter.setColumns(genres); Log.e(TAG, "botiques.size()=" + genres.size()); handler.sendEmptyMessage(MSG_GENRES_DATA_GOT); // 下载每个子栏目的专辑列表 for (Column genre : genres) { getColumnAlbumsList(genre); } // WatchDog.genresDataGot = true; } } }); } 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) { endLoading(); adapter.notifyDataSetChanged(); for (int i = 0; i < adapter.getGroupCount(); i++) { xlvGenres.expandGroup(i); } xlvGenres.setSelectionFromTop(firstVisibleItemPosition, scrollTop); } } public GenresFragment() { } public GenresFragment(Context context) { this.context = context; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { System.out.println("onCreateView"); // parentActivityChangeTitle(); // parentActivityChangeButton(); updateTitlebar(); view = LayoutInflater.from(context).inflate(R.layout.genres_fragment, null); view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); initComponents(); startLoading(); getColumnsWhenActive(); // registerReceivers(); return view; } private void getColumnsWhenActive() { 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(); } // private void parentActivityChangeTitle() { // TabWebActivity.tvTitle.setText("类型"); // TabWebActivity.currentMenuItem = "类型"; // ((TabWebActivity) context).useTitleStyle(TabWebActivity.TITLE_STYLE_NORMAL); // } // // private void parentActivityChangeButton() { // TabWebActivity.changeButton("btnMenu"); // } 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; } @Override public void onResume() { super.onResume(); WatchDog.currentSelfReloader = this; fragmentIsActive = true; // ((TabWebActivity)context).checkSlidingHidden(); } // private void parentActivityChangeTitle() { // TabWebActivity.tvTitle.setText("类型"); // TabWebActivity.currentFragment = "类型"; // // TabWebActivity.slidingMenuInitOk = false; // } // // private void parentActivityChangeButton() { // TabWebActivity.changeButton("btnMenu"); // } protected void getColumnAlbumsList(final Column column) { Pools.executorService1.submit(new Runnable() { @Override public void run() { String json = new HttpGetter(context).getColumnAlbumsList(column, Constant.COLUMN_ALBUMS_4_GENRES); ColumnDetail columnDetail = new JsonUtil().getColumnDetail(json); column.setDetail(columnDetail); // 拿到栏目专辑列表后刷新界面 handler.sendEmptyMessage(MSG_GENRES_DATA_GOT); // // 下载每张专辑的封面图片 // for (int i = 0; i < columnDetail.getAlbums().size(); i++) { // // // columnDetail.getAlbums().get(i).setCoverBitmap(Constant.albumCover); // downloadImage(columnDetail.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) { // 得到专辑封面后刷新界面 // album.setCoverBitmap(new // SoftReference<Bitmap>(bitmap)); // handler.post(new Runnable() { // @Override // public void run() { // if (adapter != null) { // // endLoading(); // adapter.notifyDataSetChanged(); // for (int i = 0; i < adapter.getGroupCount(); i++) { // xlvGenres.expandGroup(i); // } // } // } // }); if (bitmap != null && !bitmap.isRecycled()) { album.setBitmap(new SoftReference<Bitmap>(bitmap)); handler.sendEmptyMessage(MSG_GENRES_DATA_GOT); } } }); // 得到封面后刷新界面 if (bitmap != null && !bitmap.isRecycled()) { album.setBitmap(new SoftReference<Bitmap>(bitmap)); handler.sendEmptyMessage(MSG_GENRES_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 xlvGenres = (ExpandableListView) view.findViewById(R.id.xlv_genres); initExpandableListView(); } @Override public void onDetach() { // unregisterReceivers(); // letsSeeHeaven(); /* * if (genres.size() != 0) { recycleBitmaps(); } */ super.onDetach(); } private void registerReceivers() { // context.registerReceiver(fitGenresTitleReceier, new IntentFilter("fitGenresTitleReceier")); } private void initArguments() { } private void initExpandableListView() { xlvGenres.setGroupIndicator(null); xlvGenres.setItemsCanFocus(true); xlvGenres.setOnGroupClickListener(null); adapter = new ColumnsListAdapter(getActivity(), genres, xlvGenres, this); xlvGenres.setAdapter(adapter); xlvGenres.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, true) { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { firstVisibleItemPosition = xlvGenres.getFirstVisiblePosition(); lastVisibleItemPosition = xlvGenres.getLastVisiblePosition(); super.onScrollStateChanged(view, scrollState); } }); /* * xlvGenres.setOnScrollListener(new OnScrollListener() { * * @Override public void onScrollStateChanged(AbsListView view, int * scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) * { firstVisibleItemPosition = xlvGenres.getFirstVisiblePosition(); * lastVisibleItemPosition = xlvGenres.getLastVisiblePosition(); if * (xlvGenres.getChildAt(0) != null) { scrollTop = * xlvGenres.getChildAt(0).getTop(); } * * paintAlbumsWithinSightNFreeOthers(); } } * * @Override public void onScroll(AbsListView view, int * firstVisibleItem, int visibleItemCount, int totalItemCount) { * * } }); */ } protected void paintAlbumsWithinSightNFreeOthers() { for (int i = 0; i < genres.size(); i++) { if (2 * i + 1 >= firstVisibleItemPosition && 2 * i - 1 <= lastVisibleItemPosition) { downloadColumnImage(genres.get(i)); } else { FreeColumnImage(genres.get(i)); } } } private void FreeColumnImage(Column column) { if (column.getDetail() == null || column.getDetail().getAlbums() == null) { return; } for (Album album : column.getDetail().getAlbums()) { 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) { for (Album album : column.getDetail().getAlbums()) { downloadImage(album); } } private void unregisterReceivers() { // context.unregisterReceiver(fitGenresTitleReceier); } @Override public void letsSeeHeaven() { for (Column column : genres) { for (Album album : column.getDetail().getAlbums()) { album.recyleBitmap(); } } } @Override public void recordCurrentDataAndPosition() { WatchDog.columnsInBotiques = genres; WatchDog.fvipInGenres = firstVisibleItemPosition; // WatchDog.lvipInBotiques = -1; WatchDog.stInGenres = scrollTop; WatchDog.flagInGenres = true; } @Override public void getSavedDataAndPosition() { genres = WatchDog.columnsInGenres; firstVisibleItemPosition = WatchDog.fvipInGenres; scrollTop = WatchDog.stInGenres; handler.sendEmptyMessage(MSG_GENRES_DATA_GOT); WatchDog.flagInGenres = false; WatchDog.columnsInGenres = null; } @Override public int getFistVisiblePosition() { return firstVisibleItemPosition; } @Override public int getLastVisiblePosition() { return lastVisibleItemPosition; } @Override public void recycleBitmaps() { for (Column column : genres) { if (column.getDetail() == null || column.getDetail().getAlbums() == null) { continue; } for (Album album : column.getDetail().getAlbums()) {// null pointer album.recyleBitmap(); } } } @Override public void updateTitlebar() { WatchDog.tabWebFragment.setPopbackable(false); WatchDog.tabWebFragment.setTitle("类型"); WatchDog.tabWebFragment.currentMenuItem = "类型"; } @Override public void reload() { System.out.println(TAG+"reloading..."); startLoading(); getColumnsWhenActive(); } @Override public void onDataLoadFailed() { handler.sendEmptyMessage(MSG_DATA_LOAD_FAILD); } }