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的更多相关文章

  1. android ListView上拉加载更多 下拉刷新功能实现(采用pull-to-refresh)

    Android实现上拉加载更多功能以及下拉刷新功能, 采用了目前比较火的PullToRefresh,他是目前实现比较好的下拉刷新的类库. 目前他支持的控件有:ListView, ExpandableL ...

  2. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  3. [转]Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能

    版权声明:本文出自郭霖的博客,转载必须注明出处. 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9255575 最近项目中需要用到L ...

  4. Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能 (转)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9255575 最 近项目中需要用到ListView下拉刷新的功能,一开始想图省事,在 ...

  5. Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能

    不可否认,微信.QQ列表的滑动删除.编辑功能着实很经典(从IOS那边模仿过来的),然.Android这边,对列表的操作,其实大多还停留上下文菜单来实现. Android如何实现list item的滑动 ...

  6. Android——谷歌官方下拉刷新控件SwipeRefreshLayout(转)

    转自:http://blog.csdn.net/zouzhigang96/article/details/50476402 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言: 如今谷歌推出了 ...

  7. 利用Swiperefreshlayout实现下拉刷新功能的技术探讨

    在常见的APP中通常有着下拉页面从而达到刷新页面的功能,这种看似简单的功能有着花样繁多的实现方式.而利用Swiperefreshlayout实现下拉刷新功能则是其中比较简明扼要的一种. 一般来说,在竖 ...

  8. 解决:mui 的 选项卡 + 下拉刷新 功能,在其中嵌入 iframe 后,在 iphone 的情况下,iframe 的内容不能滚动,只显示第一屏内容。

    我所遇到的情况是,使用 mui 的 选项卡 + 下拉刷新 功能时,其中有2个页面是嵌入了别的网站的页面,而别个几个是通过 ajax 加载本网站的数据.然后 在其中嵌入 iframe 后,在 iphon ...

  9. 原生js实现简单的下拉刷新功能

    前言: 我们在浏览移动端web页面的时候,经常会用到下拉刷新. 现在我们用原生的js实现这个非常简单的下拉刷新功能. (温馨提示:本文比较基础,功能也很简单.写的不好的地方,希望大神提点一二.) 一. ...

随机推荐

  1. 零基础学python-5.4 数字精度与复数

    1.整数精度 这里我们对照一下python2.7与python3.4的整数精度 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/ ...

  2. BS Web窗体 动态修改WebConfig文件参数及数据库链接串

    WebConfig操作帮助类 /// /// ConfigurationOperator 的摘要说明 /// public class ConfigurationOperator : IDisposa ...

  3. samba 文件和目录权限控制

    [laps_test]         comment = laps_test         path = /home/laps         browseable = yes         w ...

  4. What is purpose of @ConditionalOnProperty annotation?

    http://stackoverflow.com/questions/26394778/what-is-purpose-of-conditionalonproperty-annotation **** ...

  5. 解决Access denied for user &#39;&#39;@&#39;localhost&#39; to database &#39;mysql&#39;问题

    在改动mysql的root用户password后,再登陆,提示如标题的错误,找了一番答案之后,最终解决,过程例如以下: 1.停掉mysql:      service mysqld stop 2.使用 ...

  6. 个别图片IE中无法显示问题

    今天有人保障,某些图片在IE下无法打开,但是其他浏览器均没有问题.以前还真没遇到过这类问题,从上至下查看了一遍,能排除的因素基本都排除了,还是不知道为什么不能显示,真是奇怪了.最后注意到无法显示的图片 ...

  7. Farey Sequence(欧拉函数)

    题意:给出式子F F中分子分母互质,且分子小于分母 例: F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/ ...

  8. asp.net 导出EXCEL超高兼容(不用装Excel)

    用网上的代码你会发现,下载下来后,会提示"你尝试打开的的文件的格式与文件扩展名指定的格式不一致 请验证文件没有损坏且来源可信的提示,研究了好久 后来发现可以使用人家做好的组件NOPI去实现, ...

  9. zabbix的agent端的主动模式关键三个参数

    如多主机超过300+和队列内容过多,就采用主动模式. [root@web03 zabbix]# egrep -v "^#|^$" zabbix_agentd.conf PidFil ...

  10. Spring.Net框架三:使用Spring.Net框架实现多数据库

    在前面的两篇文章中简单介绍了Spring.Net和如何搭建Spring.Net的环境,在本篇文章中将使用Spring.Net实现多数据库的切换. 一.建立一个空白的解决方案,名称为“SpringDot ...