`
龙哥IT
  • 浏览: 254582 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Android瀑布流StaggeredGridView

 
阅读更多

原文  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

    本项目是针对Android平台的一个库,用于实现图片瀑布流效果,主要使用了`StaggeredGridView`控件。 `StaggeredGridView`是Android对传统`GridView`的扩展,能够支持不同高度的网格项,从而实现瀑布流的效果。相比于...

    瀑布流StaggeredGridView 下拉刷新

    瀑布流布局,通常被称为...总之,瀑布流StaggeredGridView结合下拉刷新和自动加载更多,为用户提供了一种流畅且富有动态感的浏览体验。通过理解和实践上述知识点,开发者可以构建出更具有吸引力的Android应用。

    Android瀑布流网格的代码例子

    Android的瀑布流网格的代码例子,用于演示瀑布流网格的实现效果。其中给出了瀑布流网格的三种实现方式,包括WaterfallGridView,以及开源的StaggeredGridView和PinterestLikeAdapterView

    android 瀑布流列表,可以复用listview上下拉刷新

    瀑布流布局在Android开发中是一种常见且流行的设计模式,它模拟了网页中常见的商品展示方式,每一列的高度不固定,形成一种类似瀑布倾泻的效果。在这个案例中,我们看到的"android 瀑布流列表,可以复用listview上下...

    使用StaggeredGridView搭建的图片瀑布流lib和demo

    在Android开发中,创建美观且动态的用户界面是至关重要的,尤其在展示大量图片时,瀑布流布局(也称为Staggered GridView)是一种流行的选择。瀑布流布局模仿了Pinterest的风格,图片按照不同高度排列,形成错落有致...

    安卓Android源码——StaggeredGridView-master.rar

    综上所述,StaggeredGridView-master项目提供了一个强大的工具,帮助Android开发者轻松地在应用中实现瀑布流布局。理解并掌握其工作原理和使用方法,将有助于提升应用的用户体验和设计美感。在实际项目中,结合其他...

    安卓实现瀑布流

    在这个案例中,我们将探讨如何使用`ImageLoader`和`StaggeredGridView`来实现一个Android应用中的瀑布流功能。 首先,让我们了解这两个关键组件: 1. **ImageLoader**:这是一个用于图片加载和缓存的库,能够帮助...

    安卓Android源码——StaggeredGridView-master.zip

    在安卓开发中,`StaggeredGridView`是一个流行的布局组件,它扩展了标准的`GridView`,提供了瀑布流的效果。这种布局方式常用于电商应用、图片展示类应用,因为它能够以不规则的方式展示项目,使得视觉效果更加生动...

    瀑布流StaggeredGrid实现瀑布流的效果,

    在早期的Android版本中,开发者通常需要自定义ViewGroup或者使用第三方库如FlowLayout来实现瀑布流,但随着Android Support Library的更新,StaggeredGridAdapter和StaggeredGridView类的引入,使得瀑布流的实现变得...

    瀑布流gridview

    在Android开发中,实现瀑布流效果通常会用到GridView或者自定义的布局管理器。本篇将重点讲解如何通过非对称的GridView实现瀑布流照片墙。 首先,标准的GridView是基于固定列宽和等高单元格的布局,这并不符合瀑布...

    Android应用源码之StaggeredGridView--IT计算机-毕业设计.zip

    与标准的GridView不同,StaggeredGridView能够更好地适应不同大小的元素,使得视觉效果更加灵活和动态,通常用于创建瀑布流布局,常见于电商应用的商品展示。 一、StaggeredGridView的原理与结构 StaggeredGridView...

    StaggeredGridView瀑布流

    StaggeredGridView在Android开发中是一种实现瀑布流的控件,它是GridView的扩展,允许开发者创建类似Pinterest的界面。与传统的GridView不同,GridView通常以固定的行高和列宽显示元素,而StaggeredGridView则可以...

    android StaggeredGridView源码.zip

    在Android开发中,StaggeredGridView是一种非常有用的控件,它扩展了标准的GridView,提供了瀑布流布局的效果,常用于展示商品、图片等需要不规则排列的场景。本压缩包"android StaggeredGridView源码.zip"包含了...

    Android应用源码之StaggeredGridView-master.rar

    【Android应用源码之StaggeredGridView-master】是一款基于Android平台的开源项目,它主要实现了瀑布流布局(Staggered GridView)的效果。瀑布流布局是一种常见的网页和移动应用设计模式,通常用于展示图像或者商品...

    StaggeredGridView源码及Demo

    StaggeredGridView是一个开源的Android库,它的核心功能在于模仿Pinterest的布局风格,即每个单元格(item)的高度可以不固定,形成一种错落有致的效果。这使得它在展示图片、卡片等视觉元素时具有更强的表现力和...

    StaggeredGridView

    总的来说,`StaggeredGridView`是一个强大且易于使用的工具,对于想要在Android应用中实现瀑布流效果的开发者来说,是一个不可或缺的资源。通过熟练掌握和运用这个库,可以大大提高开发效率,同时也能够提升应用的...

    瀑布流框架的布局效果

    瀑布流框架的布局效果源码,源码AndroidStaggeredGrid,该效果是一款不错的瀑布流效果也是一个很好用的瀑布流的框架,是继承AbsListView的,效果很好用了,大家可以了解一下吧。 An Android staggered grid view ...

    StaggeredGridView-master.zip

    通过分析StaggeredGridView的源码,开发者不仅能理解瀑布流布局的工作原理,还能学习到如何在Android中自定义布局管理器和适配器,这对于提升Android开发能力大有裨益。在实际项目中,可以根据需求对源码进行修改和...

Global site tag (gtag.js) - Google Analytics