首页 > 代码库 > Android StaggeredGrid 加下拉刷新功能 PullToRefresh
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 = http://www.mamicode.com/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) { //加载事件 onl oadMoreItems(); } } } private boolean mHasRequestedMore; private void onl oadMoreItems() { //加载事件。。。 mHasRequestedMore = false; } }
然后就可以用了,是不是很爽~~
Android StaggeredGrid 加下拉刷新功能 PullToRefresh
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。