能够下拉刷新和上拉加载的瀑布流

瀑布流在刚出来的时候很火,大家都觉得下过很炫,于是乎我也玩了一把,但结果,应用到具体场景的时候,我们需要使用上拉刷新功能,开源的效果不能达到,于是乎,经过大神指点,重新实现了这一效果。

首先,我们需要引用瀑布流的工程,github项目地址:https://github.com/paulzeng/AndroidStaggeredGrid,这个项目我已经fork到了我的主页,下载,然后对其library进行引用。

然后我们引入下拉刷新的工程,github项目地址:https://github.com/paulzeng/Android-PullToRefresh,这个项目我也fork了,下载,引入library。我们需要修改PullToRefreshBase.java类,加入两个方法,用于判断是上拉还是下拉。

public boolean isHeaderShown() {return getHeaderLayout().isShown();}public boolean isFooterShown() {return getFooterLayout().isShown();}

import android.annotation.SuppressLint;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.etsy.android.grid.StaggeredGridView;import com.handmark.pulltorefresh.library.OverscrollHelper;import com.handmark.pulltorefresh.library.PullToRefreshBase;import com.handmark.pulltorefresh.library.R;@SuppressLint("NewApi")public class PullToRefreshStaggeredGridView extendsPullToRefreshBase<StaggeredGridView> {private static final OnRefreshListener<StaggeredGridView> defaultOnRefreshListener = new OnRefreshListener<StaggeredGridView>() {@Overridepublic 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);}@Overridepublic final Orientation getPullToRefreshScrollDirection() {return Orientation.VERTICAL;}@Overrideprotected 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;}@Overrideprotected 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 visibleboolean isTopFullyVisible = v.getTop() >= 0;result = isTopFullyVisible;}}return result;}@Overrideprotected 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;}@Overrideprotected void onPtrRestoreInstanceState(Bundle savedInstanceState) {super.onPtrRestoreInstanceState(savedInstanceState);}@Overrideprotected 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// fuzzinessstatic final int OVERSCROLL_FUZZY_THRESHOLD = 2;// WebView seems quite reluctant to overscroll so we use the scale// factor to scale it's valuestatic final float OVERSCROLL_SCALE_FACTOR = 1.5f;public InternalStaggeredGridViewSDK9(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected 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;}}}然后我们自定义布局文件,使用我们重新写好的控件

没有什么可留恋,只有抑制不住的梦想,

能够下拉刷新和上拉加载的瀑布流

相关文章:

你感兴趣的文章:

标签云: