package com.kitty.poclient.fragment.store; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.IntentFilter; import android.graphics.PixelFormat; 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.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.kitty.poclient.R; import com.kitty.poclient.adapter.ArtistsListAdapter; import com.kitty.poclient.common.UpnpApp; import com.kitty.poclient.common.ViewFactory; import com.kitty.poclient.common.WatchDog; import com.kitty.poclient.domain.Artist; 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.widget.MyLetterListView; import com.kitty.poclient.widget.MyLetterListView.OnTouchingLetterChangedListener; public class ArtistsFragment extends Fragment implements NobleMan, TitlebarUpdateFragment,SelfReloader { // Looper.prepare private final String TAG = "ArtistsFragment"; private Context context; private View view; private LinearLayout llLoading; private LinearLayout llContent; private LinearLayout llNoData; private LinearLayout llLetterListview; private ListView lvArtists; private MyLetterListView mllvLetters; private TextView overlay; private ArtistsListAdapter adapter; private View footerView; private TextView tvLoadMore; private LinearLayout llLoadingMore; // private boolean isAddingData = false; private boolean dataLoadComplete = false; private List<Artist> artists = new ArrayList<Artist>(); private List<Artist> tempList = new ArrayList<Artist>();// 分页临时数据 private int maxDataItems = 10; private int maxDataItemsLarger = 30; private String[] sections; private OverlayThread overlayThread; // private String chosenLetter = "all"; // 动画 private AnimationDrawable ad; private boolean loadingRunning = false; private boolean fragmentIsActive = false; private int firstVisibleItemPosition = 0;// 记录停止卷动时第一个ITEM的序号 private int lastVisibleItemPosition = 9;// 记录停止卷动时第一个ITEM的序号 private int scrollTop = 0;// 记录停止卷动时第一个ITEM距离顶端的偏移量 private final int MSG_LETS_GET_DATA = 0; private final int MSG_DATA_NEW_GOT = 1; private final int MSG_DATA_ADD_GOT = 2; private final int MSG_NOTIFY_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_LETS_GET_DATA: if (WatchDog.flagInArtists == true) { getSavedDataAndPosition(); } else { getArtistsData(0, maxDataItems, WatchDog.currentChosenLetter, MSG_DATA_NEW_GOT); } break; case MSG_DATA_NEW_GOT: Log.e(TAG, "WatchDog.currentChosenLetter="+WatchDog.currentChosenLetter+" & msg.obj="+msg.obj); if (!WatchDog.currentChosenLetter.equals((String) msg.obj)) { break; } artists.clear(); artists.addAll(tempList); updateUI(); lvArtists.setSelection(0);//fuck // paintArtistsWithinSightAndFreeOthers(); tempList.clear(); break; case MSG_DATA_ADD_GOT: artists.addAll(tempList); updateUI(); // paintArtistsWithinSightAndFreeOthers(); tempList.clear(); break; case MSG_NOTIFY_DATA_SET_CHANGED: if (adapter != null) { adapter.notifyDataSetChanged(); } break; case MSG_DATA_LOAD_FAILD: uiShowNoData(); break; } super.handleMessage(msg); } }; // private BroadcastReceiver fitArtistsTitleReceier = new BroadcastReceiver() { // @Override // public void onReceive(Context context, Intent intent) { // parentActivityChangeButton(); // parentActivityChangeTitle(); // } // }; protected void updateUI() { if (adapter != null) { if (loadingRunning == true) { endLoading(); } // artists.addAll(tempList); adapter.notifyDataSetChanged(); // if (isAddingData == true) { // tvLoadMore.setVisibility(View.VISIBLE); // llLoadingMore.setVisibility(View.GONE); tvLoadMore.setVisibility(View.GONE); llLoadingMore.setVisibility(View.VISIBLE); // isAddingData = false; checkIfDataLoadCompleted(); // } } } private void checkIfDataLoadCompleted() { if (tempList.size() < maxDataItems) { // tvLoadMore.setVisibility(View.VISIBLE); // llLoadingMore.setVisibility(View.GONE); // tvLoadMore.setText("加载完毕"); dataLoadComplete = true; tvLoadMore.setVisibility(View.GONE); llLoadingMore.setVisibility(View.GONE); }else{ dataLoadComplete = false; } } private void hideLoadingAndShowDataLoadComplete() { tvLoadMore.setVisibility(View.GONE); llLoadingMore.setVisibility(View.GONE); UpnpApp.mainHandler.showInfo(R.string.loading_complete_info); } protected void showLoadingAndLoadMoreData() { llLoadingMore.setVisibility(View.VISIBLE); getArtistsData(artists.size(), maxDataItemsLarger, WatchDog.currentChosenLetter, MSG_DATA_ADD_GOT); } private void lvAddFooterView() { lvArtists.addFooterView(footerView); // tvLoadMore.setOnClickListener(new OnClickListener() { // @Override // public void onClick(View v) { // onTvLoadMoreClick(); // } // }); } // protected void onTvLoadMoreClick() { // tvLoadMore.setVisibility(View.GONE); // llLoadingMore.setVisibility(View.VISIBLE); // isAddingData = true; // // // 获取更多数据 // getArtistsData(artists.size(), maxDataItemsLarger, WatchDog.currentChosenLetter, MSG_DATA_ADD_GOT); // } private void getArtistsData(final int startItem, final int maxItems, final String firstLetter, final int dataMode) { Pools.executorService1.submit(new Runnable() { @Override public void run() { String json = new HttpGetter(context).getArtistsListII(startItem, maxItems, firstLetter);// 获取到的数据 if (!(new JsonUtil().validate(json))) { return; }else{ tempList = new JsonUtil().getArtists(json);// 获取到的数据 System.out.println("tempList=" + tempList); Message msg = new Message(); msg.what = dataMode; msg.obj = firstLetter; handler.sendMessage(msg); WatchDog.artistsDataGot = true; } } }); } public ArtistsFragment() { } public ArtistsFragment(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.artists_fragment, null); view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); initComponents(); startLoading(); getArtistListWhenActive(); // registerReceivers(); return view; } private void getArtistListWhenActive() { 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 startLoading() { Log.e(TAG, "startLoading()"); llContent.setVisibility(View.INVISIBLE); llLoading.setVisibility(View.VISIBLE); llNoData.setVisibility(View.INVISIBLE); 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(); } llLoading.setVisibility(View.GONE); llNoData.setVisibility(View.GONE); llContent.setVisibility(View.VISIBLE); 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); } private void stopLoadingAnimation() { if (ad != null && ad.isRunning()) { ad.stop(); } loadingRunning = false; } @Override public void onResume() { super.onResume(); // listViewGetFormerPosition(); WatchDog.currentSelfReloader = this; fragmentIsActive = true; } private void listViewGetFormerPosition() { if (firstVisibleItemPosition != -1) { lvArtists.setSelectionFromTop(firstVisibleItemPosition, scrollTop); } } // private void parentActivityChangeTitle() { // TabWebActivity.tvTitle.setText("演出者"); // TabWebActivity.currentMenuItem = "演出者"; // ((TabWebActivity) context).useTitleStyle(TabWebActivity.TITLE_STYLE_NORMAL); // } // // private void parentActivityChangeButton() { // TabWebActivity.changeButton("btnMenu"); // } /* * protected void downloadImage(final Artist artist) { * Pools.executorService2.submit(new Runnable() { * * @Override public void run() { String imageKey = artist.getImgUrl() + * "150"; * * Bitmap bitmap = BitmapUtil.loadImageAysnc.loadImageNohandler(imageKey, * artist.getImgUrl(), 150, false, new ImageCallBack() { * * @Override public void imageLoaded(Bitmap bitmap) { // // 得到专辑封面后刷新界面 // * artist.setBitmap(new SoftReference<Bitmap>(bitmap)); // handler.post(new * Runnable() { // @Override // public void run() { // if (adapter != null) * { // adapter.notifyDataSetChanged(); // } // } // }); * * // 得到封面后刷新界面 if (bitmap != null && !bitmap.isRecycled()) { * artist.setBitmap(new SoftReference<Bitmap>(bitmap)); * handler.sendEmptyMessage(MSG_NOTIFY_DATA_SET_CHANGED); } * * } }); * * // 得到封面后刷新界面 if (bitmap != null && !bitmap.isRecycled()) { * artist.setBitmap(new SoftReference<Bitmap>(bitmap)); * handler.sendEmptyMessage(MSG_NOTIFY_DATA_SET_CHANGED); } * * bitmap = null; } }); * * } */ 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); llLetterListview = (LinearLayout) view.findViewById(R.id.ll_letter_listview); lvArtists = (ListView) view.findViewById(R.id.lv_artists); mllvLetters = (MyLetterListView) view.findViewById(R.id.mllv); footerView = LayoutInflater.from(context).inflate(R.layout.artists_item_footerview, null); tvLoadMore = (TextView) footerView.findViewById(R.id.tv_load_more); llLoadingMore = (LinearLayout) footerView.findViewById(R.id.ll_loading_more); initLoadingmoreAnim(); initListView(); initMyLetterListView(); initOverlay(); } private void initLoadingmoreAnim() { ImageView ivAnim=(ImageView) llLoadingMore.findViewById(R.id.iv_loading_more); new AnimUtil(context).initLoadingmoreAnim(ivAnim); // AnimationDrawable ad=(AnimationDrawable)getResources().getDrawable(R.anim.login_seraching_anim); // ivAnim.setBackgroundDrawable(ad); // ad.start(); } private void initOverlay() { overlayThread = new OverlayThread();// 用于让提示字母消失 LayoutInflater inflater = LayoutInflater.from(context); overlay = (TextView) inflater.inflate(R.layout.overlay, null); overlay.setVisibility(View.INVISIBLE); // WindowManager.LayoutParams lp = new // WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, // LayoutParams.WRAP_CONTENT, // WindowManager.LayoutParams.TYPE_APPLICATION, // WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | // WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, // PixelFormat.TRANSLUCENT); WindowManager.LayoutParams lp = new WindowManager.LayoutParams(context.getResources().getInteger(R.integer.letter_overlay_size), context.getResources().getInteger(R.integer.letter_overlay_size), WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); windowManager.addView(overlay, lp); } private void initMyLetterListView() { mllvLetters.setChoose(getChosenLetterPosition(WatchDog.currentChosenLetter)); llLetterListview.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Log.e(TAG, "llLetterListview onTouch: event.getY()=" + event.getY()); mllvLetters.onTouch(event); return true; } }); mllvLetters.setOnTouchingLetterChangedListener(new LetterListViewListener()); } private void initListView() { lvAddFooterView(); adapter = new ArtistsListAdapter(context); adapter.setArtists(artists); lvArtists.setAdapter(adapter); lvArtists.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position < adapter.getCount()) { recordCurrentDataAndPosition(); // 进入相关演出者详情页 Artist artist = artists.get(position); WatchDog.tabWebFragment.goArtistDetail(artist); } // else { // CustomToast.makeText(context, "触发加载更多", // Toast.LENGTH_SHORT).show(); // } } }); // 启动滑动监听 lvArtists.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { firstVisibleItemPosition = lvArtists.getFirstVisiblePosition(); lastVisibleItemPosition = lvArtists.getLastVisiblePosition(); if (lvArtists.getChildAt(0) != null) { scrollTop = lvArtists.getChildAt(0).getTop(); } // 判断是否见底 if(lastVisibleItemPosition>=artists.size()-1){ if(dataLoadComplete){ //显示加载完毕 hideLoadingAndShowDataLoadComplete(); }else{ // 加载更多并显示动画 showLoadingAndLoadMoreData(); } } // paintArtistsWithinSightAndFreeOthers(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } /* * protected void paintArtistsWithinSightAndFreeOthers() { for (int i = 0; i * < artists.size(); i++) { if (i >= firstVisibleItemPosition && i <= * lastVisibleItemPosition) { downloadImage(artists.get(i)); } else { Bitmap * bitmap = artists.get(i).getBitmap(); if (bitmap != null && * !bitmap.equals(Constant.albumCover)) { bitmap.recycle(); bitmap = null; } * } } } * * private void freeArtistsWithinSight() { for (int i = 0; i < * artists.size(); i++) { if (i >= firstVisibleItemPosition && i <= * lastVisibleItemPosition) { Bitmap bitmap = artists.get(i).getBitmap(); if * (bitmap != null && !bitmap.equals(Constant.albumCover)) { * bitmap.recycle(); bitmap = null; } } } } */ @Override public void onDetach() { // unregisterReceivers(); if (artists.size() != 0) { recycleBitmaps(); } super.onDetach(); } private void registerReceivers() { // context.registerReceiver(fitArtistsTitleReceier, new IntentFilter("fitArtistsTitleReceier")); } private void unregisterReceivers() { // context.unregisterReceiver(fitArtistsTitleReceier); } @Override public void recycleBitmaps() { // freeArtistsWithinSight(); } @Override public void letsSeeHeaven() { } @Override public void recordCurrentDataAndPosition() { WatchDog.formerArtists = artists; // WatchDog.currentChosenLetter = chosenLetter; WatchDog.fvipInArtists = firstVisibleItemPosition; WatchDog.lvipInArtists = lastVisibleItemPosition; WatchDog.stInArtists = scrollTop; WatchDog.flagInArtists = true; } @Override public void getSavedDataAndPosition() { firstVisibleItemPosition = WatchDog.fvipInArtists; scrollTop = WatchDog.stInArtists; artists = WatchDog.formerArtists; // chosenLetter = WatchDog.currentChosenLetter; mllvLetters.setChoose(getChosenLetterPosition(WatchDog.currentChosenLetter)); updateUI(); // paintArtistsWithinSightAndFreeOthers(); WatchDog.flagInArtists = false; WatchDog.formerArtists = null; } private int getChosenLetterPosition(String chosenLetter) { String[] b = { "*", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#" }; for (int i = 0; i < b.length; i++) { if (b[i].equals(chosenLetter)) { return i; } } return 0; } @Override public int getFistVisiblePosition() { return firstVisibleItemPosition; } @Override public int getLastVisiblePosition() { return lastVisibleItemPosition; } private class OverlayThread implements Runnable { @Override public void run() { overlay.setVisibility(View.GONE); } } public void loadContentIfChosenConfirmed(final String s) { handler.postDelayed(new Runnable() { @Override public void run() { // if (WatchDog.currentChosenLetter.equals(s)) { // getArtistsData(0, maxDataItems, WatchDog.currentChosenLetter, MSG_DATA_NEW_GOT); // } getArtistsData(0, maxDataItems, s, MSG_DATA_NEW_GOT); } }, // 1500 0); } private class LetterListViewListener implements OnTouchingLetterChangedListener { @Override public void onTouchingLetterChanged(final String s) { // UpnpApp.showToastMessage(s + " touched!"); String _s = s; if (_s.equals("#")) { _s = "all"; } else if (_s.equals("*")) { return; } // 加载字母下的内容 WatchDog.currentChosenLetter = _s; loadContentIfChosenConfirmed(_s); // 显示字母并在1.5秒后消失 overlay.setText(s); overlay.setVisibility(View.VISIBLE); handler.removeCallbacks(overlayThread); handler.postDelayed(overlayThread, 1500); } } @Override public void updateTitlebar() { WatchDog.tabWebFragment.setPopbackable(false); WatchDog.tabWebFragment.setTitle("演出者"); WatchDog.tabWebFragment.currentMenuItem = "演出者"; } @Override public void reload() { System.out.println(TAG+"reloading..."); startLoading(); getArtistListWhenActive(); } @Override public void onDataLoadFailed() { handler.sendEmptyMessage(MSG_DATA_LOAD_FAILD); } }