Android StaggeredGrid 加下拉刷新功能 PullToRefresh
2014-11-24 16:58
429 查看
https://github.com/etsy/AndroidStaggeredGrid 用的github上面提供瀑布流,继承于abslistview,回收机制不错,并且提供了OnScrollListener来监听滑动时间。
然后想加一个下拉刷新功能,下面分享一下研究的最终结果。
Java代码:
XML代码:
Java Activity:
然后就可以用了,是不是很爽~~
然后想加一个下拉刷新功能,下面分享一下研究的最终结果。
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 下拉刷新之ScrollView--PullToRefreshScrollView
- Pull To Refresh---下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
- [置顶] Android-PullToRefresh上拉下拉刷新加载更多,以及gridview刷新功能的Library下载地址
- android下拉刷新之PullToRefreshListView(二)
- android使用PullToRefresh实现上拉加载和下拉刷新效果
- android下拉刷新之PullToRefreshListView(一)
- 下拉刷新框架android-Ultra-Pull-To-Refresh导入到Android Studio
- 使用Android开源工具PullToRefresh实现上啦刷新下拉加载
- android使用PullToRefresh实现上拉加载和下拉刷新效果
- android使用Ultra-PullToRefresh实现下拉刷新自定义代码
- Android自定义上拉加载下拉刷新PullToRefreshListView
- android控件 下拉刷新pulltorefresh
- android使用PullToRefresh实现上拉加载和下拉刷新效果
- 【Android-PullToRefresh】 上拉刷新、下拉加载 使用详解
- Android 利用第三方库实现下拉刷新 -android-Ultra-Pull-To-Refresh
- 下拉刷新框架Android-Ultra-Pull-To-Refresh的使用
- PullToRefreshRecyclerView——带上拉刷新下拉加载功能的RecyclerView
- PullToRefresh的上拉加载下拉刷新功能实现(导包到项目中路径不要有中文)
- Android使用PullToRefresh实现上拉加载和下拉刷新效果的代码
- android中下拉刷新的例子android-Ultra-Pull-To-Refresh 源码解析