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

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

  • 相关阅读:
    Elasticsearch的CURD、复杂查询、聚合函数、映射mappings
    Python操作Elasticsearch对象
    Python连接Elasticsearch
    Elasticsearch的分析过程,内置字符过滤器、分析器、分词器、分词过滤器(真是变态多啊!美滋滋)
    Elasticsearch的数据组织
    Elasticsearch背景初识
    Nginx之负载均衡
    linux常用命令
    百度地图API,定位您的当前位置
    使用gulp自动构建项目
  • 原文地址:https://www.cnblogs.com/niray/p/4119082.html
Copyright © 2020-2023  润新知