Twidere-App-Android-Twitter.../twidere/src/main/java/org/mariotaku/twidere/fragment/support/BasePullToRefreshStaggeredG...

212 lines
6.9 KiB
Java

/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 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.support;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.mariotaku.refreshnow.widget.OnRefreshListener;
import org.mariotaku.refreshnow.widget.RefreshMode;
import org.mariotaku.refreshnow.widget.RefreshNowConfig;
import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator;
import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator.IndicatorConfig;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.fragment.iface.IBasePullToRefreshFragment;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.RefreshNowStaggeredGridView;
public abstract class BasePullToRefreshStaggeredGridFragment extends BaseSupportStaggeredGridFragment implements
IBasePullToRefreshFragment, OnTouchListener {
@Override
public RefreshNowStaggeredGridView getListView() {
return (RefreshNowStaggeredGridView) super.getListView();
}
@Override
public RefreshMode getRefreshMode() {
if (getView() == null) return RefreshMode.NONE;
return getListView().getRefreshMode();
}
@Override
public boolean isRefreshing() {
if (getView() == null) return false;
return getListView().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 ProgressBar(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 RefreshNowStaggeredGridView lv = (RefreshNowStaggeredGridView) inflater.inflate(
R.layout.refreshnow_staggered_gridview, lframe, false);
lv.setId(android.R.id.list);
lv.setDrawSelectorOnTop(false);
lv.setOnRefreshListener(this);
lv.setOnTouchListener(this);
lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
final RefreshNowProgressIndicator indicator = new RefreshNowProgressIndicator(context);
final IndicatorConfig config = ThemeUtils.buildRefreshIndicatorConfig(context);
indicator.setConfig(config);
final int indicatorHeight = Math.round(3 * getResources().getDisplayMetrics().density);
lframe.addView(indicator, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, indicatorHeight,
Gravity.TOP));
lv.setRefreshIndicatorView(indicator);
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;
}
@Override
public void onRefreshComplete() {
}
@Override
public final void onRefreshStart(final RefreshMode mode) {
if (mode.hasStart()) {
onRefreshFromStart();
} else if (mode.hasEnd()) {
onRefreshFromEnd();
}
}
@Override
public final boolean onTouch(final View v, final MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
onListTouched();
break;
}
}
return false;
}
@Override
public void setConfig(final RefreshNowConfig config) {
if (getView() == null) return;
getListView().setConfig(config);
}
@Override
public void setOnRefreshListener(final OnRefreshListener listener) {
}
@Override
public void setRefreshComplete() {
if (getView() == null) return;
getListView().setRefreshComplete();
}
@Override
public void setRefreshIndicatorView(final View view) {
if (getView() == null) return;
getListView().setRefreshIndicatorView(view);
}
@Override
public void setRefreshing(final boolean refresh) {
if (getView() == null) return;
getListView().setRefreshing(refresh);
}
@Override
public void setRefreshMode(final RefreshMode mode) {
if (getView() == null) return;
getListView().setRefreshMode(mode);
}
@Override
public boolean triggerRefresh() {
onRefreshFromStart();
setRefreshing(true);
return true;
}
protected void onListTouched() {
}
}