package com.m.ui.fragment; import java.io.Serializable; import uk.co.senab.actionbarpulltorefresh.extras.actionbarsherlock.PullToRefreshLayout; import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh; import uk.co.senab.actionbarpulltorefresh.library.listeners.OnRefreshListener; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.widget.SwipeRefreshLayout; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ListView; import android.widget.TextView; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.m.R; import com.m.common.context.GlobalContext; import com.m.common.settings.SettingUtility; import com.m.support.Inject.ViewInject; import fr.castorflex.android.smoothprogressbar.SmoothProgressBar; /** * 思来想去,刷新页面都差不多,干脆统一放置到一起<br/> * 统一操作规范:下拉刷新、FooterView自动加载更多 * * @author Jeff.Wang * * @date 2014年9月29日 */ public abstract class ACombinationRefreshListFragment<T extends Serializable, Ts extends Serializable> extends ARefreshFragment<T, Ts, ListView> implements android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener, OnRefreshListener, OnRefreshListener2<ListView> { static String TAG = "ACombinationRefreshListFragment"; public static final String REFRESH_LIST_TYPE = "pRefreshViewType"; public enum RefreshListType { pulltorefresh,// actionbarPulltorefresh,// androidPulltorefresh// google v4包刷新控件 } private RefreshListType listType; @ViewInject(idStr = "listView") ListView mListView; @ViewInject(idStr = "refreshListView") PullToRefreshListView refreshListView; @ViewInject(idStr = "swipeRefreshLayout") SwipeRefreshLayout swipeRefreshLayout; @ViewInject(idStr = "listView_2") ListView mListView_2; private boolean isResetRefreshing = false;// 2014-10-10 新增这个属性,当控件是PullToRefreshListView时,调用setRefresh()方法没有重置数据,而是refresh数据的BUG protected View mFooterView; View layLoading; TextView txtLoadingHint; TextView btnLoadMore; private PullToRefreshLayout mPullToRefreshLayout; private boolean autoLoadMore = true; @Override void _layoutInit(LayoutInflater inflater, Bundle savedInstanceState) { listType = configListType(); mFooterView = View.inflate(getActivity(), R.layout.layout_footerview, null); SmoothProgressBar mHeaderProgressBar = (SmoothProgressBar) mFooterView.findViewById(R.id.progress); mHeaderProgressBar.setIndeterminate(true); layLoading = mFooterView.findViewById(R.id.layLoading); txtLoadingHint = (TextView) mFooterView.findViewById(R.id.txtLoadingHint); btnLoadMore = (TextView) mFooterView.findViewById(R.id.btnLoadMore); super._layoutInit(inflater, savedInstanceState); initRefreshList(savedInstanceState); getListView().addFooterView(mFooterView); setRefreshList(); resetRefreshView(getConfig()); if (savedInstanceState == null) { setFooterRefreshing(); } } protected void initRefreshList(Bundle savedInstanceState) { } private void setRefreshList() { if (listType == RefreshListType.actionbarPulltorefresh) { getListView().setAdapter(getAdapter()); mPullToRefreshLayout = new PullToRefreshLayout(getActivity()); ActionBarPullToRefresh.from(getActivity()) .insertLayoutInto((ViewGroup) findViewById(refreshLayoutInfo())) .theseChildrenArePullable(R.id.listView).listener(this).setup(mPullToRefreshLayout); if (refreshListView != null) refreshListView.setVisibility(View.GONE); if (swipeRefreshLayout != null) swipeRefreshLayout.setVisibility(View.GONE); mListView.setVisibility(View.VISIBLE); } else if (listType == RefreshListType.pulltorefresh) { refreshListView.setAdapter(getAdapter()); refreshListView.setOnRefreshListener(this); refreshListView.getRefreshableView().setRecyclerListener(this); refreshListView.getRefreshableView().setOnScrollListener(this); refreshListView.setMode(Mode.PULL_FROM_START); refreshListView.setVisibility(View.VISIBLE); if (mListView != null) mListView.setVisibility(View.GONE); if (swipeRefreshLayout != null) swipeRefreshLayout.setVisibility(View.GONE); } else if (listType == RefreshListType.androidPulltorefresh) { getListView().setAdapter(getAdapter()); swipeRefreshLayout.setOnRefreshListener(this); swipeRefreshLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); swipeRefreshLayout.setVisibility(View.VISIBLE); if (mListView != null) mListView.setVisibility(View.GONE); if (refreshListView != null) refreshListView.setVisibility(View.GONE); } } @Override public AbsListView getRefreshView() { if (listType == RefreshListType.actionbarPulltorefresh) return mListView; else if (listType == RefreshListType.pulltorefresh) return refreshListView.getRefreshableView(); else if (listType == RefreshListType.androidPulltorefresh) return mListView_2; return null; } public int refreshLayoutInfo() { return R.id.layoutContent; } @Override public void onPullDownToRefresh() { if (isResetRefreshing) { isResetRefreshing = false; requestData(RefreshMode.reset); } else { super.onPullDownToRefresh(); } } @Override public void onRefreshStarted(View view) { requestData(RefreshMode.refresh); } @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { onPullDownToRefresh(); } @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { onPullUpToRefresh(); }; @Override public void onRefresh() { onPullDownToRefresh(); } @Override protected int inflateContentView() { return R.layout.layout_combination_list; } private ListView getListView() { return (ListView) getRefreshView(); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { super.onScrollStateChanged(view, scrollState); if (scrollState == SCROLL_STATE_FLING) { } else if (scrollState == SCROLL_STATE_IDLE) { for (int i = 0; i < getListView().getFooterViewsCount(); i++) { if (getListView().getChildAt(getListView().getChildCount() - i - 1) == mFooterView) { if (autoLoadMore) { setFooterRefreshing(); onPullUpToRefresh(); } break; } } } } public boolean setFooterRefreshing() { layLoading.setVisibility(View.VISIBLE); btnLoadMore.setVisibility(View.GONE); return false; } @Override public boolean setRefreshing() { if (listType == RefreshListType.actionbarPulltorefresh) { mPullToRefreshLayout.setRefreshing(true); return false; } else if (listType == RefreshListType.pulltorefresh) { isResetRefreshing = true; refreshListView.setRefreshing(true); // 这个控件默认会回调下拉事件,父类不再requestData() return true; } else if (listType == RefreshListType.androidPulltorefresh) { swipeRefreshLayout.setRefreshing(true); return false; } return false; } @Override public boolean isRefreshing() { if (listType == RefreshListType.actionbarPulltorefresh) if(mPullToRefreshLayout.isRefreshing()) return true; else if (listType == RefreshListType.pulltorefresh) if (refreshListView.isRefreshing()) return true; else if (listType == RefreshListType.androidPulltorefresh) if (swipeRefreshLayout.isRefreshing()) return true; return super.isRefreshing(); } @Override public void setRefreshViewComplete() { if (listType == RefreshListType.actionbarPulltorefresh) { if (mPullToRefreshLayout.isRefreshing()) mPullToRefreshLayout.setRefreshComplete(); } else if (listType == RefreshListType.pulltorefresh) { if (refreshListView.isRefreshing()) refreshListView.onRefreshComplete(); } else if (listType == RefreshListType.androidPulltorefresh) { if (swipeRefreshLayout.isRefreshing()) swipeRefreshLayout.setRefreshing(false); } } @Override protected void taskStateChanged(ABaseTaskState state, Serializable extra) { super.taskStateChanged(state, extra); if (state == ABaseTaskState.finished) { if (mPullToRefreshLayout != null && mPullToRefreshLayout.isRefreshing() && layLoading.getVisibility() != View.VISIBLE) setRefreshViewComplete(); layLoading.setVisibility(View.GONE); btnLoadMore.setVisibility(View.VISIBLE); } else if (state == ABaseTaskState.prepare) { if (loadingLayout != null && loadingLayout.getVisibility() != View.VISIBLE && mPullToRefreshLayout != null && layLoading.getVisibility() != View.VISIBLE) { setRefreshing(); } } }; @Override public void resetRefreshView(RefreshConfig config) { autoLoadMore = config.canLoadMore; if (autoLoadMore) { layLoading.setVisibility(View.GONE); // 没有设置文本 if (TextUtils.isEmpty(btnLoadMore.getText())) btnLoadMore.setText(R.string.hintLoadMore); if (TextUtils.isEmpty(txtLoadingHint.getText())) txtLoadingHint.setText(R.string.hintLoading); btnLoadMore.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { layLoading.setVisibility(View.VISIBLE); btnLoadMore.setVisibility(View.GONE); onPullUpToRefresh(); } }); } else { layLoading.setVisibility(View.GONE); btnLoadMore.setVisibility(View.VISIBLE); btnLoadMore.setText(R.string.cannotRequestUpdate); btnLoadMore.setOnClickListener(null); } } protected RefreshListType configListType() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(GlobalContext.getInstance()); int value = Integer.parseInt(prefs.getString("pRefreshViewType", SettingUtility.getPermanentSettingAsStr(REFRESH_LIST_TYPE, "0"))); switch (value) { case 0: return RefreshListType.pulltorefresh; case 1: return RefreshListType.actionbarPulltorefresh; case 2: return RefreshListType.androidPulltorefresh; default: return RefreshListType.actionbarPulltorefresh; } } protected View getFooterView() { return mFooterView; } protected PullToRefreshLayout getPullToRefreshLayout() { return mPullToRefreshLayout; } }