原文 http://www.cnphp6.com/archives/63495
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平台的一个库,用于实现图片瀑布流效果,主要使用了`StaggeredGridView`控件。 `StaggeredGridView`是Android对传统`GridView`的扩展,能够支持不同高度的网格项,从而实现瀑布流的效果。相比于...
瀑布流布局,通常被称为...总之,瀑布流StaggeredGridView结合下拉刷新和自动加载更多,为用户提供了一种流畅且富有动态感的浏览体验。通过理解和实践上述知识点,开发者可以构建出更具有吸引力的Android应用。
Android的瀑布流网格的代码例子,用于演示瀑布流网格的实现效果。其中给出了瀑布流网格的三种实现方式,包括WaterfallGridView,以及开源的StaggeredGridView和PinterestLikeAdapterView
瀑布流布局在Android开发中是一种常见且流行的设计模式,它模拟了网页中常见的商品展示方式,每一列的高度不固定,形成一种类似瀑布倾泻的效果。在这个案例中,我们看到的"android 瀑布流列表,可以复用listview上下...
在Android开发中,创建美观且动态的用户界面是至关重要的,尤其在展示大量图片时,瀑布流布局(也称为Staggered GridView)是一种流行的选择。瀑布流布局模仿了Pinterest的风格,图片按照不同高度排列,形成错落有致...
综上所述,StaggeredGridView-master项目提供了一个强大的工具,帮助Android开发者轻松地在应用中实现瀑布流布局。理解并掌握其工作原理和使用方法,将有助于提升应用的用户体验和设计美感。在实际项目中,结合其他...
在这个案例中,我们将探讨如何使用`ImageLoader`和`StaggeredGridView`来实现一个Android应用中的瀑布流功能。 首先,让我们了解这两个关键组件: 1. **ImageLoader**:这是一个用于图片加载和缓存的库,能够帮助...
在安卓开发中,`StaggeredGridView`是一个流行的布局组件,它扩展了标准的`GridView`,提供了瀑布流的效果。这种布局方式常用于电商应用、图片展示类应用,因为它能够以不规则的方式展示项目,使得视觉效果更加生动...
在早期的Android版本中,开发者通常需要自定义ViewGroup或者使用第三方库如FlowLayout来实现瀑布流,但随着Android Support Library的更新,StaggeredGridAdapter和StaggeredGridView类的引入,使得瀑布流的实现变得...
在Android开发中,实现瀑布流效果通常会用到GridView或者自定义的布局管理器。本篇将重点讲解如何通过非对称的GridView实现瀑布流照片墙。 首先,标准的GridView是基于固定列宽和等高单元格的布局,这并不符合瀑布...
与标准的GridView不同,StaggeredGridView能够更好地适应不同大小的元素,使得视觉效果更加灵活和动态,通常用于创建瀑布流布局,常见于电商应用的商品展示。 一、StaggeredGridView的原理与结构 StaggeredGridView...
StaggeredGridView在Android开发中是一种实现瀑布流的控件,它是GridView的扩展,允许开发者创建类似Pinterest的界面。与传统的GridView不同,GridView通常以固定的行高和列宽显示元素,而StaggeredGridView则可以...
在Android开发中,StaggeredGridView是一种非常有用的控件,它扩展了标准的GridView,提供了瀑布流布局的效果,常用于展示商品、图片等需要不规则排列的场景。本压缩包"android StaggeredGridView源码.zip"包含了...
【Android应用源码之StaggeredGridView-master】是一款基于Android平台的开源项目,它主要实现了瀑布流布局(Staggered GridView)的效果。瀑布流布局是一种常见的网页和移动应用设计模式,通常用于展示图像或者商品...
StaggeredGridView是一个开源的Android库,它的核心功能在于模仿Pinterest的布局风格,即每个单元格(item)的高度可以不固定,形成一种错落有致的效果。这使得它在展示图片、卡片等视觉元素时具有更强的表现力和...
总的来说,`StaggeredGridView`是一个强大且易于使用的工具,对于想要在Android应用中实现瀑布流效果的开发者来说,是一个不可或缺的资源。通过熟练掌握和运用这个库,可以大大提高开发效率,同时也能够提升应用的...
瀑布流框架的布局效果源码,源码AndroidStaggeredGrid,该效果是一款不错的瀑布流效果也是一个很好用的瀑布流的框架,是继承AbsListView的,效果很好用了,大家可以了解一下吧。 An Android staggered grid view ...
通过分析StaggeredGridView的源码,开发者不仅能理解瀑布流布局的工作原理,还能学习到如何在Android中自定义布局管理器和适配器,这对于提升Android开发能力大有裨益。在实际项目中,可以根据需求对源码进行修改和...