package com.suan.weclient.activity; import android.annotation.SuppressLint; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; import android.widget.ListView; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.internal.view.menu.ActionMenuView; import com.suan.weclient.R; import com.suan.weclient.adapter.FansListAdapter; import com.suan.weclient.util.GlobalContext; import com.suan.weclient.util.SharedPreferenceManager; import com.suan.weclient.util.Util; import com.suan.weclient.util.data.DataManager; import com.suan.weclient.util.data.DataManager.FansListChangeListener; import com.suan.weclient.util.data.holder.resultHolder.FansResultHolder; import com.suan.weclient.util.net.WechatManager; import com.suan.weclient.util.net.WechatManager.OnActionFinishListener; import com.suan.weclient.view.actionbar.CustomFansActionView; import com.suan.weclient.view.ptr.PTRListview; public class FansListActivity extends SherlockActivity implements PTRListview.OnLoadListener, PTRListview.OnRefreshListener { private ActionBar actionBar; private PTRListview ptrListview; private FansListAdapter fansListAdapter; private DataManager mDataManager; private FansHandler fansHandler; private static final int PAGE_FANS = 10; /* about adapter list change */ public static final int MESSAGE_NOTIFY_TYPE_ONLY_REFRESH = 2; public static final int MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA = 3; public void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.fans_list_layout); initWidgets(); initData(); initActionBar(); initListener(); loadData(); } private void initWidgets() { ptrListview = (PTRListview) findViewById(R.id.fans_list); } private void initActionBar() { actionBar = getSupportActionBar(); actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayUseLogoEnabled(false); CustomFansActionView customFansActionView = new CustomFansActionView(this); customFansActionView.init(mDataManager, this); ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ActionMenuView.LayoutParams.MATCH_PARENT, ActionMenuView.LayoutParams.MATCH_PARENT); actionBar.setCustomView(customFansActionView, layoutParams); } private void initData() { GlobalContext globalContext = (GlobalContext) getApplicationContext(); mDataManager = globalContext.getDataManager(); fansListAdapter = new FansListAdapter(this, mDataManager); ptrListview.setAdapter(fansListAdapter); ptrListview.setonRefreshListener(this); ptrListview.setOnLoadListener(this); fansHandler = new FansHandler(); } private void loadData() { mDataManager.doListLoadStart(); mDataManager.getWechatManager().getFansList(0, mDataManager.getCurrentPosition(), mDataManager.getCurrentFansHolder().getCurrentGroupId() + "", new OnActionFinishListener() { @Override public void onFinish(int code, Object object) { // TODO Auto-generated method stub switch (code) { case WechatManager.ACTION_SUCCESS: mDataManager.doFansGet((FansResultHolder) object); break; case WechatManager.ACTION_TIME_OUT: break; case WechatManager.ACTION_OTHER: break; case WechatManager.ACTION_SPECIFICED_ERROR: break; } ptrListview.onRefreshComplete(); } }); } public void onPause() { super.onPause(); mDataManager.clearListLoadingListner(); } private void initListener() { mDataManager.addFansListChangeListener(new FansListChangeListener() { @Override public void onFansGet(FansResultHolder fansResultHolder) { // TODO Auto-generated method stub Message notifyMessage = new Message(); notifyMessage.arg1 = MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA; notifyMessage.obj = fansResultHolder; fansHandler.sendMessage(notifyMessage); } }); mDataManager.setListLoadingListener(new DataManager.ListLoadingListener() { @Override public void onLoadStart() { ptrListview.onRefreshStart(); } @Override public void onLoadFinish() { ptrListview.onRefreshComplete(); } }); } @Override public void onLoad() { new GetDataTask(ptrListview, GetDataTask.PTR_MODE_LOAD).execute(); } @Override public void onRefresh() { new GetDataTask(ptrListview, GetDataTask.PTR_MODE_REFRESH).execute(); } public class FansHandler extends Handler { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.arg1) { case MESSAGE_NOTIFY_TYPE_ONLY_REFRESH: break; case MESSAGE_NOTIFY_TYPE_REFRESH_WITH_NEW_DATA: FansResultHolder messageResultHolder = (FansResultHolder) msg.obj; mDataManager.getCurrentFansHolder().mergeFansResult(messageResultHolder); if (messageResultHolder != null) { switch (messageResultHolder.getResultMode()) { case FansResultHolder.RESULT_MODE_ADD: ptrListview.onLoadComplete(); break; case FansResultHolder.RESULT_MODE_REFRESH: fansListAdapter.updateCache(); ptrListview.onRefreshComplete(); ptrListview.setSelection(1); break; } } break; } int size = mDataManager.getCurrentFansHolder().getFansCount(); ptrListview.setLoadEnable(size % PAGE_FANS == 0); ptrListview.requestLayout(); fansListAdapter.notifyDataSetChanged(); } } private class GetDataTask extends AsyncTask<Void, Void, Void> { PTRListview mRefreshedView; private boolean end = false; private int mode; public static final int PTR_MODE_REFRESH = 2; public static final int PTR_MODE_LOAD = 3; public GetDataTask(PTRListview refreshedView, int mode) { this.mode = mode; mRefreshedView = refreshedView; end = false; if (mDataManager.getCurrentFansHolder() == null) { end = true; ptrListview.onLoadComplete(); return; } try { if (mode == PTR_MODE_LOAD) { if (mDataManager.getCurrentFansHolder().getFansCount() % PAGE_FANS != 0) { end = true; mRefreshedView.onLoadComplete(); } else { int page = mDataManager.getCurrentFansHolder() .getFansBeans().size() / 10; mDataManager.getWechatManager().getFansList(page, mDataManager.getCurrentPosition(), mDataManager.getCurrentFansHolder().getCurrentGroupId() + "", new OnActionFinishListener() { @Override public void onFinish(int code, Object object) { // TODO Auto-generated method stub switch (code) { case WechatManager.ACTION_SUCCESS: mDataManager.doFansGet((FansResultHolder) object); break; case WechatManager.ACTION_TIME_OUT: break; case WechatManager.ACTION_OTHER: break; case WechatManager.ACTION_SPECIFICED_ERROR: break; } ptrListview.onLoadComplete(); end = true; } }); } } else if (mode == PTR_MODE_REFRESH) { mDataManager.getWechatManager().getFansList(0, mDataManager.getCurrentPosition(), mDataManager.getCurrentFansHolder().getCurrentGroupId() + "", new OnActionFinishListener() { @Override public void onFinish(int code, Object object) { // TODO Auto-generated method stub switch (code) { case WechatManager.ACTION_SUCCESS: mDataManager.doFansGet((FansResultHolder) object); break; case WechatManager.ACTION_TIME_OUT: break; case WechatManager.ACTION_OTHER: break; case WechatManager.ACTION_SPECIFICED_ERROR: break; } ptrListview.onRefreshComplete(); end = true; } }); } } catch (Exception e) { } } @Override protected Void doInBackground(Void... params) { // Simulates a background job. try { while (!end) { Thread.sleep(50); } } catch (Exception exception) { } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); switch (mode) { case PTRListview.PTR_MODE_LOAD: mRefreshedView.onLoadComplete(); break; case PTRListview.PTR_MODE_REFRESH: mRefreshedView.onRefreshComplete(); break; } } } @Override public void finish() { super.finish(); overridePendingTransition(R.anim.activity_movein_from_right_anim, R.anim.activity_moveout_to_left_anim); } }