package com.kitty.poclient.fragment.store; 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.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.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.SimpleImageLoadingListener; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.kitty.poclient.R; 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.JsonUtil; import com.kitty.poclient.util.PowerfulBigMan; public class TopsFragment139 extends Fragment implements NobleMan, TitlebarUpdateFragment, SelfReloader { private final String TAG = "TopsFragment"; private Context context; private boolean stopped = false; private View view; private AnimationDrawable ad; private LinearLayout llLoading; private LinearLayout llContent; private LinearLayout llNoData; private ListView lvTops; private TopsAdapter 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 BRUSH_START_DELAYED = 2000; private final int LISTVIEW_BRUSH_INTERVAL_MILLIS = 1500; private static final int ALBUMCOVER_FADEIN_INTERVAL_MILLIS = 1500; 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 final int MSG_BRUSH_LIST = 5; 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: getTopsList(); break; case MSG_ADAPTER_DATA_SET_CHANGED: adapter.notifyDataSetChanged(); break; case MSG_DATA_LOAD_FAILD: uiShowNoData(); case MSG_BRUSH_LIST: brushList(); } 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; } protected void brushList() { Log.e(TAG, "brushList()"); adapter.brushCount++; adapter.notifyDataSetChanged(); } 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(); // lvTops.setSelectionFromTop(firstVisibleItemPosition, scrollTop); // handler.sendMessageDelayed(handler.obtainMessage(MSG_ADAPTER_DATA_SET_CHANGED), // 500); } } public TopsFragment139() { } public TopsFragment139(Context context) { this.context = context; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e(TAG, "onCreateView()"); stopped = false; updateTitlebar(); view = LayoutInflater.from(context).inflate(R.layout.tops_fragment_for_139, null); view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); initComponents(); startLoading(); getTopListWhenActive(); 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() { 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); // 3秒钟后开始列表自刷新 handler.postDelayed(new Runnable() { @Override public void run() { startListViewBrush(); } }, BRUSH_START_DELAYED); loadingRunning = false; } private void getTopsList() { Pools.executorService1.submit(new Runnable() { @Override public void run() { tops = new HttpGetter(context).getTopsList(); if (tops != null && tops.size() != 0) { handler.sendEmptyMessage(MSG_TOPS_DATA_GOT); // 下载每个子栏目的专辑列表 for (Column column : tops) { getTopAlbumList(column); } } } }); } protected void getTopAlbumList(final Column column) { Pools.executorService1.submit(new Runnable() { @Override public void run() { String json = new HttpGetter(context).getColumnAlbumsList(column, Constant.COLUMN_ALBUMS_4_TOPS); ColumnDetail columnDetail = new JsonUtil().getColumnDetail(json); column.setDetail(columnDetail); // 拿到栏目专辑列表后刷新界面 handler.sendEmptyMessage(MSG_TOPS_DATA_GOT); // // 下载每张专辑的封面图片 // for (int i = 0; i < columnDetail.getAlbums().size(); i++) { // columnDetail.getAlbums().get(i).setCoverBitmap(Constant.albumCover); // downloadImage(columnDetail.getAlbums().get(i)); // } } }); } 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 lvTops = (ListView) view.findViewById(R.id.lv_tops); initTopsListView(); } @Override public void onStop() { stopped = true; super.onStop(); } @Override public void onDetach() { // unregisterReceivers(); if (tops != null && tops.size() != 0) { recycleBitmaps(); } super.onDetach(); } private void initTopsListView() { Log.e(TAG, "initTopsListView()"); adapter = new TopsAdapter(); lvTops.setAdapter(adapter); lvTops.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { goColumnDetailFragment(position); } }); } private void startListViewBrush() { Log.e(TAG, "startListViewBrush()"); Log.e(TAG, "detached=" + stopped); new Thread(new Runnable() { @Override public void run() { while (true && !stopped) { handler.sendEmptyMessage(MSG_BRUSH_LIST); try { Thread.sleep(LISTVIEW_BRUSH_INTERVAL_MILLIS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } private void goColumnDetailFragment(int position) { if (PowerfulBigMan.testClickInterval() == false) { return; } String name = tops.get(position).getName(); long id = tops.get(position).getId(); WatchDog.tabWebFragment.showTopContent(id,name); } 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); } class TopsAdapter extends BaseAdapter { private ImageLoader loader; private DisplayImageOptions options; private ImageLoadingListener animateFirstListener; private boolean currentPositionBrushNeeded =false; public int brushCount = 0; public int drawable1 = 0; public int drawable2 = 1; public TopsAdapter() { 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(); } @Override public int getCount() { // return tops.size(); return tops.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; } @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.tops_item_139, null); holder = new Holder(convertView); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } try { Log.e(TAG, "getView():brushCount=" + brushCount + ",position=" + position + ",albumPosition=" + getAlbumPosition(position)); String imgUrl = tops.get(position).getDetail().getAlbums().get(getAlbumPosition(position)).getImgUrl(); if(currentPositionBrushNeeded){ loader.displayImage(imgUrl, holder.ivAlbumCover, options,animateFirstListener); }else{ loader.displayImage(imgUrl, holder.ivAlbumCover); } // Drawable d1=getResources().getDrawable(R.drawable.ic_launcher); // Drawable d2=getResources().getDrawable(R.drawable.ic_launcher_xxbox); // Drawable[] layers; // if(brushCount%2==0){ // layers=new Drawable[]{d1,d2}; // }else{ // layers=new Drawable[]{d2,d1}; // } // TransitionDrawable td=new TransitionDrawable(layers); // holder.ivAlbumCover.setImageDrawable(td); // td.startTransition(3000); } catch (Exception e) { Log.e(TAG, "excetption using imageloader e=" + e); e.printStackTrace(); } holder.tvRankName.setText(tops.get(position).getName()); return convertView; } private int getAlbumPosition(int position) { int albumPosition = 0; // 刷新位置 if (position % 7 == (brushCount - 1) % 7) { albumPosition = (brushCount - 1) / 7 + 1; currentPositionBrushNeeded = true; } // 向前的位置 else if (position % 7 < (brushCount - 1) % 7) { albumPosition = (brushCount - 1) / 7 + 1; currentPositionBrushNeeded = false; } // 向后的位置 else { albumPosition = (brushCount - 1) / 7; currentPositionBrushNeeded = false; } return correctAlbumPosition(albumPosition); } private int correctAlbumPosition(int albumPosition) { if (albumPosition >= 6) { albumPosition = albumPosition % 6; } return albumPosition; } } class Holder { private ImageView ivAlbumCover; private TextView tvRankName; public Holder(View convertView) { ivAlbumCover = (ImageView) convertView.findViewById(R.id.iv_album_cover); tvRankName = (TextView) convertView.findViewById(R.id.tv_rank_name); } } /** * 使用动画 */ 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); } } } }