上滑加载更多的 RecyclerView

15 篇文章 1 订阅
这是一个简单的自定义 RecyclerView 利用本身的滑动监听实现上滑加载.
 来自新入职的公司xbxm.好处时轻量, 不用去依赖三方包
package com.newboom.umall.view;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.AttributeSet;
import android.view.MotionEvent;

public class LoadMoreRecyclerView extends RecyclerView implements Runnable {
    private boolean isLoadingMore;
    private OnLoadMoreListener mOnLoadMoreListener;
    private boolean isNoMore; //是否不需要上滑加载(最后一页加载完毕时设置为true)

    public LoadMoreRecyclerView(Context context) {
        super(context);
        init();
    }

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

    public LoadMoreRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void loadingMoreComplete() {
        this.isLoadingMore = false;
    }

    private void init() {
        addOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LayoutManager layoutManager = getLayoutManager();
                int itemCount = 0;
                if (layoutManager instanceof LinearLayoutManager) {
                    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
                    int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                    itemCount = linearLayoutManager.getItemCount();

                    //dy>0 表示向下滑动
                    load(dy, itemCount, lastVisibleItem);
                } else if (layoutManager instanceof GridLayoutManager) {
                    GridLayoutManager gridLayoutMananager = (GridLayoutManager) layoutManager;
                    int lastVisibleItem = gridLayoutMananager.findLastVisibleItemPosition();
                    itemCount = gridLayoutMananager.getItemCount();

                    //dy>0 表示向下滑动
                    load(dy, itemCount, lastVisibleItem);

                } else {
                    StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
                    int[] visibleItems = staggeredGridLayoutManager
                            .findLastVisibleItemPositions(null);
                    itemCount = staggeredGridLayoutManager.getItemCount();
                    int lastVisibleItem = Math.max(visibleItems[0], visibleItems[1]);
                    load(dy, itemCount, lastVisibleItem);


                }
            }
        });
    }

    private void load(int dy, int itemCount, int lastVisibleItem) {
//        if (lastVisibleItem <= itemCount - 1) {
//            RecyclerView.Adapter adapter =  getAdapter();
//            if (adapter instanceof BaseRecyclerViewAdapter) {
//                BaseRecyclerViewAdapter baseRecyclerViewAdapter = (BaseRecyclerViewAdapter) adapter;
//                baseRecyclerViewAdapter.setIsUseFooter(false);
//                baseRecyclerViewAdapter.notifyDataSetChanged();
//            }
//            return;
//        }

        //dy>0 表示向下滑动
        if (lastVisibleItem >= itemCount - 2 && dy > 0) {
            if (!isLoadingMore && !isNoMore) {
                isLoadingMore = true;
                if (mOnLoadMoreListener != null) {
                    postDelayed(this, 500);
                }
            }
        }
    }

    public boolean isNoMore() {
        return isNoMore;
    }

    public void setNoMore(boolean noMore) {
        isNoMore = noMore;
    }

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        mOnLoadMoreListener = onLoadMoreListener;
    }

    @Override
    public void run() {
        mOnLoadMoreListener.onLoadMore();
    }

    public interface OnLoadMoreListener {
        void onLoadMore();
    }

    private float xDistance, yDistance, xLast, yLast;

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                xLast = ev.getX();
                yLast = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                if (yLast == 0 || xLast == 0) {
                    xLast = ev.getX();
                    yLast = ev.getY();
                }

                final float curX = ev.getX();
                final float curY = ev.getY();

                xDistance += Math.abs(curX - xLast);
                yDistance += Math.abs(curY - yLast);
                xLast = curX;
                yLast = curY;

                if (xDistance > yDistance) {
                    return false;
                }
        }
        return super.onInterceptTouchEvent(ev);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值