Android StaggeredGrid 加下拉重新整理功能 PullToRefresh

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   io   ar   color   os   

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 StaggeredGrid 加下拉重新整理功能 PullToRefresh

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.