Android StaggeredGrid 加下拉刷新功能 PullToRefresh

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; } }

然后就可以用了,是不是很爽~~

你可能感兴趣的:(android)