1 ,xml布局:com.xinshangyun.app.ui.view.PullToRefreshLayout    android:id="@+id/fudan_refresh_view"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:layout_below="@+id/title_bar"    android:divider="@android:color/transparent"    android:dividerHeight="@dimen/dp_0"    android:listSelector="@android:color/transparent">            

2,自定义的RecycleView

public class PullableRecyclerView extends RecyclerView  implements Pullable {    private int lastPosition;    private boolean mCanPullDown = true;    private boolean mCanPullUp = true;    private boolean pd = true;    public PullableRecyclerView(Context context) {        super(context);    }    public PullableRecyclerView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }    public PullableRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);    }    //判断是否可以下拉刷新    public void setNo(boolean pd){        this.pd = pd;    }    //是否可以下拉    public void setCanPullDown(boolean canPullDown) {        this.mCanPullDown = canPullDown;    }    public void setCanPullUp(boolean canPullUp) {        this.mCanPullUp = canPullUp;    }    /**     * 可以下拉     *     * @return     */    @Override    public boolean canPullDown() {        if(mCanPullDown) {            if (getChildCount() == 0) {                return true;            } else if (getChildAt(0).getTop() >= 0) {                if (getLayoutManager() instanceof LinearLayoutManager) {                    int firstVisibleItem = ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition();                    if (firstVisibleItem == 0) {                        return true;                    }                } else if (getLayoutManager() instanceof GridLayoutManager) {                    int firstVisibleItem = ((GridLayoutManager) getLayoutManager()).findFirstVisibleItemPosition();                    if (firstVisibleItem == 0) {                        return true;                    }                }else if(getLayoutManager() instanceof StaggeredGridLayoutManager){                    //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组                    //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了//                    int[] lastPositionsDown = new int[((StaggeredGridLayoutManager) getLayoutManager()).getSpanCount()];                    int lastPositionsDown[] = ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(null);                    if(findMin(lastPositionsDown)==0){                        return true;                    }                }            }        }        return false;    }    /**     * 可以上拉     *     * @return     */    @Override    public boolean canPullUp() {        if(mCanPullUp) {            if (getChildCount() == 0) {                return true;            } else {                RecyclerView.LayoutManager layoutManager = getLayoutManager();                if (layoutManager instanceof GridLayoutManager) {                    //通过LayoutManager找到当前显示的最后的item的position                    lastPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();                } else if (layoutManager instanceof LinearLayoutManager) {                    lastPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();                } else if (layoutManager instanceof StaggeredGridLayoutManager) {                    //因为StaggeredGridLayoutManager的特殊性可能导致最后显示的item存在多个,所以这里取到的是一个数组                    //得到这个数组后再取到数组中position值最大的那个就是最后显示的position值了                    int[] lastPositions = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];                    ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(lastPositions);                    lastPosition = findMax(lastPositions);                }                //时判断界面显示的最后item的position是否等于itemCount总数-1也就是最后一个item的position                //如果相等则说明已经滑动到最后了                 if (lastPosition == getLayoutManager().getItemCount()-1 &&  this.computeVerticalScrollExtent() + this.computeVerticalScrollOffset()                        >= this.computeVerticalScrollRange()) {                    return true;                }            }        }        return false;    }    private int findMax(int[] lastPositions) {        int max = lastPositions[0];        for (int value : lastPositions) {            if (value > max) {                max = value;            }        }        return max;    }    private int findMin(int[] lastPositions) {        int min = lastPositions[0];        for (int value : lastPositions) {            if (value< min) {                min = value;            }        }        return min;    }}

 

 

更多相关文章

  1. 什么是链表?链表与数组的区别?
  2. C# 数组作为参数传递出现的问题解决
  3. 第三章C++:字符串string、向量vector和数组
  4. Ruby如何创建数组
  5. C++实现在二维数组中的查找
  6. c语言数组怎么定义?
  7. c语言数组怎么输入?
  8. 二维数组怎么定义
  9. c语言中二维数组怎么用?

随机推荐

  1. 介绍MVC、MVP和MVVM的区别与用法
  2. 学习asp.net的学习顺序与学习内容分享
  3. asp.net如何利用ashx生成图形验证码的实
  4. ASP.NET中有关Config文件的读写功能讲解
  5. 几种RIA技术介绍
  6. C#中的正则表达式如何验证中文字符的实例
  7. Asp.Net用控件实现本地图片的显示
  8. 理解ASP.NET中多层架构
  9. C#关于验证身份证号码的实例分析(正确性)
  10. 比较.NET中接口与类的区别