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. django.db.utils.OperationalError: no such table: auth_user

    关于使用django 首次创建超级管理员时,出现     django.db.utils.OperationalError: no such table: auth_user   错误 1.首先使用命 ...

  2. 使用原生SQL返回实体类具体实现详情

    注:可以直接复制粘贴,欢迎提出各种问题,谢谢! 因为网上查询大都是相同的,自己做时发现很多不懂,摸索了很久才弄懂,所以写了这个例子,比较容易看懂吧. 使用原生SQL查询并将结果返回实体中: (1)因为 ...

  3. Oracle宣布很多其它的Java 9 新特性

    随着Oracle确认了其余的4个Java 9特性,下一代Java的计划開始变得更清晰了,Oracle已经发布了第二套Java 9特性.自从Oracle在今年早些时候宣布了3个新的API和模块化源代码后 ...

  4. error: no matching function for call to 'Ui::GoToCellDialog::setupUi(QDialog*&)' ui.setupUi(dialog); ^

    环境:Qt5.3 参考书是:C++ GUI Qt4编程 问题描述: 按照书中的例子2-2做,编译时遇到的问题,从字面意思看是没有匹配的函数可用,UI::GotoCellDialog类是自动生成的,所以 ...

  5. Unicode Table

    Unicode Table http://www.tamasoft.co.jp/en/general-info/unicode.html   00 01 02 03 04 05 06 07 08 09 ...

  6. lua工具库penlight--08额外的库(一)

    额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时  ...

  7. EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

    EAGAIN.EWOULDBLOCK.EINTR与非阻塞 长连接 EWOULDBLOCK用于非阻塞模式,不需要重新读或者写 EINTR指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到 ...

  8. IE9 BUG overflow :auto 底部空白解决方案

    今天去升级了到IE9,运行项目的时候发现,我的div显示滚动条时候,用js动态加载进去的内容在光标移动的时候,底部自动被撑大留着空白, IE8 Chrome这些以前都试过 没发现这个问题 研究了好久 ...

  9. Lua中的table函数库

    table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组 ...

  10. python的post请求抓取数据

    python通过get方式,post方式发送http请求和接收http响应-urllib urllib2 python通过get方式,post方式发送http请求和接收http响应-- import  ...