package com.gnod.geekr.ui.activity; import java.util.ArrayList; import android.os.Bundle; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.AbsListView.OnScrollListener; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.gnod.geekr.R; import com.gnod.geekr.app.AppConfig; import com.gnod.geekr.tool.fetcher.BaseFetcher; import com.gnod.geekr.tool.fetcher.BaseFetcher.FetchCompleteListener; import com.gnod.geekr.tool.fetcher.NoticeFetcher; import com.gnod.geekr.tool.manager.Utils; import com.gnod.geekr.widget.ColorToast; import com.gnod.geekr.widget.ColorToast.ToastColor; import com.gnod.geekr.widget.ListViewFooter; public abstract class RefreshActivity<T> extends BaseActivity { public static final int DEFAULT_COUNT = 20; private boolean isAllLoaded = false; private MenuItem mRefresh; private ListViewFooter mFooter; private ColorToast mToastTop; private ListView mListView; private int mPage; private View mHeadView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_refreshlist); initFetcher(); initView(); bindView(); bindListener(); } @Override protected void onResume() { super.onResume(); AppConfig.sImageFetcher.setExitTasksEarly(false); } @Override protected void onPause() { super.onPause(); AppConfig.sImageFetcher.setPauseWork(false); AppConfig.sImageFetcher.setExitTasksEarly(true); AppConfig.sImageFetcher.flushCache(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu_refresh, menu); mRefresh = menu.findItem(R.id.menu_refresh); setRefreshing(true); mPage = 1; // 初始化加载10条,提高加载速度 fetchDatas(10, mPage); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_refresh: setRefreshing(true); mFooter.startLoading(); isAllLoaded = false; mPage = 1; fetchDatas(DEFAULT_COUNT, mPage); return true; } return super.onOptionsItemSelected(item); } private void setRefreshing(boolean checked) { if (mRefresh != null) { if (checked) mRefresh.setActionView(R.layout.layout_loading); else mRefresh.setActionView(null); } } private void initView() { mListView = (ListView) findViewById(R.id.view_refresh_list); mToastTop = (ColorToast) findViewById(R.id.layout_listview_top); mHeadView = getHeadView(); if (mHeadView != null) mListView.addHeaderView(mHeadView); mFooter = getFootView(); if (mFooter != null) mListView.addFooterView(mFooter); initAdapter(); mListView.setAdapter(getAdapter()); } private View getHeadView() { return null; } protected ListViewFooter getFootView() { return new ListViewFooter(this); } public abstract void initFetcher(); public abstract void initAdapter(); public abstract ListAdapter getAdapter(); public abstract int getListSize(); public abstract void bindView(); public abstract void fetchDatas(int count, int page); public abstract void onFetchSucceed(int state, ArrayList<T> resultList); public void onLastItemVisible() { if (isAllLoaded == false && !mFooter.isLoading()) { setRefreshing(true); mFooter.startLoading(); fetchDatas(DEFAULT_COUNT, ++mPage); } } public FetchCompleteListener getFetchListener() { return onFetchListener; } private void bindListener() { mListView.setOnScrollListener(new AbsListView.OnScrollListener() { private boolean lastViewVisible = false; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == OnScrollListener.SCROLL_STATE_FLING) { if (!Utils.hasHoneycomb()) { AppConfig.sImageFetcher.setPauseWork(true); } } else { AppConfig.sImageFetcher.setPauseWork(false); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (getListSize() == 0) return; if (firstVisibleItem + visibleItemCount >= totalItemCount && !lastViewVisible) { lastViewVisible = true; onLastItemVisible(); } else if (firstVisibleItem + visibleItemCount < totalItemCount) { lastViewVisible = false; } } }); setItemClckListener(); setItemLongClickListener(); } protected void setItemClckListener() { mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if ((getHeadView() != null && position == 0) || position >= getListSize()) { return; } if (getHeadView() != null) --position; onItemClicked(view, position, id); } }); } protected void setItemLongClickListener() { mListView .setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if ((getHeadView() != null && position == 0) || position >= getListSize()) { return false; } if (getHeadView() != null) --position; onItemLongClicked(view, position, id); return false; } }); } protected void onItemClicked(View view, int position, long id) { } protected void onItemLongClicked(View view, int position, long id) { } private FetchCompleteListener onFetchListener = new FetchCompleteListener() { @SuppressWarnings("unchecked") @Override public void fetchComplete(int state, int code, Object obj) { setRefreshing(false); switch (state) { case BaseFetcher.FETCH_NOT_NETWORK: case BaseFetcher.FETCH_AUTH_FAILED: mToastTop.show((String) obj, ToastColor.RED); mFooter.stopLoading("-FAILED-"); break; case BaseFetcher.FETCH_EMPTY: mFooter.stopLoading("-NO STATUS-"); break; case BaseFetcher.FETCH_FAILED: mFooter.stopLoading(""); break; case BaseFetcher.FETCH_SUCCEED_NEWS: case BaseFetcher.FETCH_SUCCEED_MORE: ArrayList<T> resultList = (ArrayList<T>) obj; onFetchSucceed(state, resultList); if (state == NoticeFetcher.FETCH_SUCCEED_NEWS) mListView.setSelection(0); if (resultList.size() < 5) { isAllLoaded = true; mFooter.stopLoading("-END-"); } else { mFooter.stopLoading("-MORE-"); } break; default: mFooter.stopLoading(""); } } }; }