Java tutorial
/* * Twidere - Twitter client for Android * * Copyright (C) 2012 Mariotaku Lee <mariotaku.lee@gmail.com> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.mariotaku.twidere.fragment; import static android.support.v4.app.ListFragmentTrojan.INTERNAL_EMPTY_ID; import static android.support.v4.app.ListFragmentTrojan.INTERNAL_LIST_CONTAINER_ID; import static android.support.v4.app.ListFragmentTrojan.INTERNAL_PROGRESS_CONTAINER_ID; import org.mariotaku.twidere.view.HoloProgressBar; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2; import com.handmark.pulltorefresh.library.PullToRefreshListView; public abstract class PullToRefreshListFragment extends BaseListFragment implements OnRefreshListener2 { private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); if ((PullToRefreshListFragment.this.getClass().getName() + SHUFFIX_REFRESH_TAB).equals(action)) { onPullDownToRefresh(); } } }; private PullToRefreshListView mPullToRefreshListView; public final PullToRefreshListView getPullToRefreshListView() { return mPullToRefreshListView; } /** * Returns whether the Widget is currently in the Refreshing mState * * @return true if the Widget is currently refreshing */ public boolean isRefreshing() { if (mPullToRefreshListView == null) return false; return mPullToRefreshListView.isRefreshing(); } /** * Provide default implementation to return a simple list view. Subclasses * can override to replace with their own layout. If doing so, the returned * view hierarchy <em>must</em> have a ListView whose id is * {@link android.R.id#list android.R.id.list} and can optionally have a * sibling view id {@link android.R.id#empty android.R.id.empty} that is to * be shown when the list is empty. * * <p> * If you are overriding this method with your own custom content, consider * including the standard layout {@link android.R.layout#list_content} in * your layout file, so that you continue to retain all of the standard * behavior of ListFragment. In particular, this is currently the only way * to have the built-in indeterminant progress state be shown. */ @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final Context context = getActivity(); final FrameLayout root = new FrameLayout(context); // ------------------------------------------------------------------ final LinearLayout pframe = new LinearLayout(context); pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); pframe.setOrientation(LinearLayout.VERTICAL); pframe.setVisibility(View.GONE); pframe.setGravity(Gravity.CENTER); final ProgressBar progress = new HoloProgressBar(context, null, android.R.attr.progressBarStyleLarge); pframe.addView(progress, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); root.addView(pframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); // ------------------------------------------------------------------ final FrameLayout lframe = new FrameLayout(context); lframe.setId(INTERNAL_LIST_CONTAINER_ID); final TextView tv = new TextView(getActivity()); tv.setId(INTERNAL_EMPTY_ID); tv.setGravity(Gravity.CENTER); lframe.addView(tv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); final PullToRefreshListView plv = new PullToRefreshListView(context); plv.setOnRefreshListener(this); mPullToRefreshListView = plv; final ListView lv = plv.getRefreshableView(); lv.setId(android.R.id.list); lv.setDrawSelectorOnTop(false); lframe.addView(plv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); root.addView(lframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); // ------------------------------------------------------------------ root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return root; } /** * Mark the current Refresh as complete. Will Reset the UI and hide the * Refreshing View */ public final void onRefreshComplete() { if (mPullToRefreshListView == null) return; mPullToRefreshListView.onRefreshComplete(); } @Override public void onStart() { super.onStart(); final IntentFilter filter = new IntentFilter(getClass().getName() + SHUFFIX_REFRESH_TAB); registerReceiver(mStateReceiver, filter); onPostStart(); } @Override public void onStop() { unregisterReceiver(mStateReceiver); super.onStop(); } /** * Set the mode of Pull-to-Refresh that this view will use. * * @param mode - Mode to set the View to */ public final void setMode(final Mode mode) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setMode(mode); } /** * Set Text to show when the Widget is being Pulled * * @param pullLabel - String to display * @param mode - Controls which Header/Footer Views will be updated. * <code>Mode.BOTH</code> will update all available, other values * will update the relevant View. */ public void setPullLabel(final String pullLabel, final Mode mode) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setPullLabel(pullLabel); } /** * A mutator to enable/disable Pull-to-Refresh for the current View * * @param enable Whether Pull-To-Refresh should be used */ public final void setPullToRefreshEnabled(final boolean enable) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setPullToRefreshEnabled(enable); } /** * Sets the Widget to be in the refresh State. The UI will be updated to * show the 'Refreshing' view. * * @param doScroll - true if you want to force a scroll to the Refreshing * view. */ public final void setRefreshing(final boolean doScroll) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setRefreshing(doScroll); } /** * Set Text to show when the Widget is refreshing * <code>setRefreshingLabel(releaseLabel, Mode.BOTH)</code> * * @param releaseLabel - String to display */ public void setRefreshingLabel(final String refreshingLabel) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setRefreshingLabel(refreshingLabel); } /** * Set Text to show when the Widget is refreshing * * @param refreshingLabel - String to display * @param mode - Controls which Header/Footer Views will be updated. * <code>Mode.BOTH</code> will update all available, other values * will update the relevant View. */ public void setRefreshingLabel(final String refreshingLabel, final Mode mode) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setRefreshingLabel(refreshingLabel, mode); } /** * Set Text to show when the Widget is being pulled, and will refresh when * released. This is the same as calling * <code>setReleaseLabel(releaseLabel, Mode.BOTH)</code> * * @param releaseLabel - String to display */ public void setReleaseLabel(final String releaseLabel) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setReleaseLabel(releaseLabel); } /** * Set Text to show when the Widget is being pulled, and will refresh when * released * * @param releaseLabel - String to display * @param mode - Controls which Header/Footer Views will be updated. * <code>Mode.BOTH</code> will update all available, other values * will update the relevant View. */ public void setReleaseLabel(final String releaseLabel, final Mode mode) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setReleaseLabel(releaseLabel, mode); } /** * A mutator to enable/disable whether the 'Refreshing' View should be * automatically shown when refreshing. * * @param showView */ public final void setShowViewWhileRefreshing(final boolean showView) { if (mPullToRefreshListView == null) return; mPullToRefreshListView.setShowViewWhileRefreshing(showView); } }