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;
}


猜你喜欢

转载自274137570-qq-com.iteye.com/blog/2299688