https://github.com/etsy/AndroidStaggeredGrid 用的github上面提供瀑布流,继承于abslistview,回收机制不错,并且提供了OnScrollListener来监听滑动时间。
Java代码:
package com.xxx.waterfall; import android.annotation.TargetApi; import android.content.Context; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.util.AttributeSet; import android.view.View; import com.handmark.pulltorefresh.library.OverscrollHelper; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.R; public class PullToRefreshStaggeredGridView extends PullToRefreshBase<StaggeredGridView> { private static final OnRefreshListener<StaggeredGridView> defaultOnRefreshListener = new OnRefreshListener<StaggeredGridView>() { @Override public void onRefresh(PullToRefreshBase<StaggeredGridView> refreshView) { } }; public PullToRefreshStaggeredGridView(Context context) { super(context); /** * Added so that by default, Pull-to-Refresh refreshes the page */ setOnRefreshListener(defaultOnRefreshListener); } public PullToRefreshStaggeredGridView(Context context, AttributeSet attrs) { super(context, attrs); /** * Added so that by default, Pull-to-Refresh refreshes the page */ setOnRefreshListener(defaultOnRefreshListener); } public PullToRefreshStaggeredGridView(Context context, Mode mode) { super(context, mode); /** * Added so that by default, Pull-to-Refresh refreshes the page */ setOnRefreshListener(defaultOnRefreshListener); } public PullToRefreshStaggeredGridView(Context context, Mode mode, AnimationStyle style) { super(context, mode, style); /** * Added so that by default, Pull-to-Refresh refreshes the page */ setOnRefreshListener(defaultOnRefreshListener); } @Override public final Orientation getPullToRefreshScrollDirection() { return Orientation.VERTICAL; } @Override protected StaggeredGridView createRefreshableView(Context context, AttributeSet attrs) { StaggeredGridView gridView; if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) { gridView = new InternalStaggeredGridViewSDK9(context, attrs); } else { gridView = new StaggeredGridView(context, attrs); } gridView.setId(R.id.gridview); return gridView; } @Override protected boolean isReadyForPullStart() { boolean result = false; View v = getRefreshableView().getChildAt(0); if (getRefreshableView().getFirstVisiblePosition() == 0) { if (v != null) { // getTop() and getBottom() are relative to the ListView, // so if getTop() is negative, it is not fully visible boolean isTopFullyVisible = v.getTop() >= 0; result = isTopFullyVisible; } } return result; } @Override protected boolean isReadyForPullEnd() { boolean result = false; int last = getRefreshableView().getChildCount() - 1; View v = getRefreshableView().getChildAt(last); int firstVisiblePosition = getRefreshableView().getFirstVisiblePosition(); int visibleItemCount = getRefreshableView().getChildCount(); int itemCount = getRefreshableView().getAdapter().getCount(); if (firstVisiblePosition + visibleItemCount >= itemCount) { if (v != null) { boolean isLastFullyVisible = v.getBottom() <= getRefreshableView().getHeight(); result = isLastFullyVisible; } } return result; } @Override protected void onPtrRestoreInstanceState(Bundle savedInstanceState) { super.onPtrRestoreInstanceState(savedInstanceState); } @Override protected void onPtrSaveInstanceState(Bundle saveState) { super.onPtrSaveInstanceState(saveState); } @TargetApi(9) final class InternalStaggeredGridViewSDK9 extends StaggeredGridView { // WebView doesn't always scroll back to it's edge so we add some // fuzziness static final int OVERSCROLL_FUZZY_THRESHOLD = 2; // WebView seems quite reluctant to overscroll so we use the scale // factor to scale it's value static final float OVERSCROLL_SCALE_FACTOR = 1.5f; public InternalStaggeredGridViewSDK9(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { final boolean returnValue = super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); // Does all of the hard work... OverscrollHelper.overScrollBy(PullToRefreshStaggeredGridView.this, deltaX, scrollX, deltaY, getScrollRange(), isTouchEvent); return returnValue; } /** * Taken from the AOSP ScrollView source */ private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { View child = getChildAt(0); scrollRange = Math.max(0, child.getHeight() - (getHeight() - getPaddingBottom() - getPaddingTop())); } return scrollRange; } } }
XML代码:
<com.xxx.waterfall.PullToRefreshStaggeredGridView android:id="@+id/HomePullToRefreshStaggerdGridView" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" android:cacheColorHint="#00000000" android:fadingEdge="none" android:overScrollMode="never" android:scrollbars="none" app:column_count="2" app:item_margin="2dp" ptr:ptrMode="both" > </com.xxx.waterfall.PullToRefreshStaggeredGridView>
Java Activity:
package com.xxx.activity; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2; public class HomeFragment extends DFFragment implements OnRefreshListener<StaggeredGridView>, AbsListView.OnScrollListener { /**下来刷新**/ private PullToRefreshStaggeredGridView mPullToRefreshStaggerdGridView; private StaggeredGridView gv private void initView() { mPullToRefreshStaggerdGridView = (PullToRefreshStaggeredGridView) parentView.findViewById(R.id.HomePullToRefreshStaggerdGridView); mPullToRefreshStaggerdGridView.setMode(Mode.PULL_FROM_END); mPullToRefreshStaggerdGridView.setOnRefreshListener(new OnRefreshListener<StaggeredGridView>() { @Override public void onRefresh(PullToRefreshBase<StaggeredGridView> refreshView) {
//刷新
} });mPullToRefreshStaggerdGridView.setMode(Mode.BOTH); mPullToRefreshStaggerdGridView.setOnRefreshListener(listener); gv=mPullToRefreshStaggerdGridView.getRefreshableView(); Gv.setAdapter(waterfallAdapter); Gv.setOnScrollListener(this); } @Override public void onScrollStateChanged(final AbsListView view, final int scrollState) { } @Override public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { if (!mHasRequestedMore) { int lastInScreen = firstVisibleItem + visibleItemCount; if (lastInScreen >= totalItemCount) { //加载事件 onLoadMoreItems(); } } } private boolean mHasRequestedMore; private void onLoadMoreItems() { //加载事件。。。 mHasRequestedMore = false; } }
然后就可以用了,是不是很爽~~