您的位置:首页 > 其它

支持下拉刷新、上拉加载的RecyclerView,基于PullToRefresh

2015-12-23 09:27 399 查看
首先我是使用 这篇文章http://blog.csdn.net/Mr_WangGang/article/details/46707441 提供的方法来实现的,感谢提供思路。

但是使用过程中,发现一个bug:上拉加载完成后,必须要向下滑一下再向上滑才能向下滚动,不然就一直判断成是上拉加载状态。

所以在此基础上,参考listview的方法判断是否应该上拉加载,重写了一下isReadyForPullEnd()这个方法。

<span style="font-size:14px;">public class PullToRefreshRecycleView extends PullToRefreshBase<RecyclerView> {

private RecyclerView mRefreshableView;

public PullToRefreshRecycleView(Context context) {
super(context);
}

public PullToRefreshRecycleView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public PullToRefreshRecycleView(Context context, Mode mode) {
super(context, mode);
}

public PullToRefreshRecycleView(Context context, Mode mode, AnimationStyle animStyle) {
super(context, mode, animStyle);
}

//重写4个方法
//1 滑动方向
@Override
public Orientation getPullToRefreshScrollDirection() {
return Orientation.VERTICAL;
}

//滑动的View
@Override
protected RecyclerView createRefreshableView(Context context, AttributeSet attrs) {
mRefreshableView = new RecyclerView(context, attrs);
return mRefreshableView;
}

//是否滑动到底部
@Override
protected boolean isReadyForPullEnd() {
return isLastItemVisible();
}

//是否滑动到顶部
@Override
protected boolean isReadyForPullStart() {
View view = mRefreshableView.getChildAt(0);

if (view != null) {
return view.getTop() >= mRefreshableView.getTop();
}
return false;
}

private boolean isLastItemVisible() {
final RecyclerView.Adapter adapter = mRefreshableView.getAdapter();

if (null == adapter) {
return true;
} else {
LinearLayoutManager layoutManager = (LinearLayoutManager) mRefreshableView.getLayoutManager();
final int lastItemPosition = mRefreshableView.getAdapter().getItemCount() -1;
final int lastVisiblePosition = layoutManager.findLastVisibleItemPosition();

/**
* This check should really just be: lastVisiblePosition ==
* lastItemPosition, but PtRListView internally uses a FooterView
* which messes the positions up. For me we'll just subtract one to
* account for it and rely on the inner condition which checks
* getBottom().
*/
if (lastVisiblePosition >= lastItemPosition - 1) {
final int childIndex = lastVisiblePosition - layoutManager.findFirstVisibleItemPosition();
final View lastVisibleChild = mRefreshableView.getChildAt(childIndex);
if (lastVisibleChild != null) {
return lastVisibleChild.getBottom() <= mRefreshableView.getBottom();
}
}
}

return false;
}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: