RecyclerView使用方法举例(2)

  本文紧接着RecyclerView使用方法举例(1),继续介绍RecyclerView的一些用法。

1. 自定义ItemDecoration分隔item

1.1. 实现SpacesItemDecoration

  可以通过加入自定义ItemDecoration的方式,为RecyclerView中的item添加装饰。如下面的SpacesItemDecoration为item四周添加指定的间距。

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int mSpaceTop;
    private int mSpaceRight;
    private int mSpaceBottom;
    private int mSpaceLeft;

    public SpacesItemDecoration(int space) {
        this.mSpaceTop = space;
        this.mSpaceRight = space;
        this.mSpaceBottom = space;
        this.mSpaceLeft = space;
    }

    public SpacesItemDecoration(int top, int right, int bottom, int left) {
        this.mSpaceTop = top;
        this.mSpaceRight = right;
        this.mSpaceBottom = bottom;
        this.mSpaceLeft = left;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.top = mSpaceTop;
        outRect.right = mSpaceRight;
        outRect.bottom = mSpaceBottom;
        outRect.left = mSpaceLeft;
    }
}

  通过重写getItemOffsets() ,为item四周加入指定的offset,使得各个item能够分隔开来。

  完整文件在这里

1.2. 使用SpacesItemDecoration

  使用自定义的ItemDecoration,只需使用RecyclerView的addItemDecoration() 即可:

recyclerView.addItemDecoration(new SpacesItemDecoration(4, 4, 4, 4));

完整文件在这里

2. 自定义OnScrollListener实现无限滚动

2.1. 实现EndlessRecyclerOnScrollListener

  RecyclerView支持通过添加OnScrollListener的方式来获取滚动距离。下面通过自定义OnScrollListener,实现“无限滚动”的效果,当列表滚动到接近末尾的位置时,自动加载更多的数据。

  实现EndlessRecyclerOnScrollListener 如下:

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    public static String LOG_TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();

    private final int VISIBLE_THRESHOLD = 10;

    private int previousTotal = 0;
    private boolean loading = true;
    private int currentPage = 1;
    private LinearLayoutManager mLinearLayoutManager;

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        int visibleItemCount = recyclerView.getChildCount();
        int totalItemCount = mLinearLayoutManager.getItemCount();
        int firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && (totalItemCount - firstVisibleItem - visibleItemCount)
                <= VISIBLE_THRESHOLD) {

            currentPage++;
            onLoadMore(currentPage);

            loading = true;
        }
    }

    public abstract void onLoadMore(int currentPage);
}

重写onScrolled() ,获取当前可见item个数onScrolled ,当前总item个数totalItemCount ,以及当前可见第一个item位置firstVisibleItem ,此时totalItemCount – firstVisibleItem – visibleItemCount 即为在当前可见item后面还不可见的剩余item个数,如果剩余item个数小于阈值VISIBLE_THRESHOLD ,则增加页面计数currentPage ,并调用onLoadMore() 来加载更多数据。onLoadMore() 由继承EndlessRecyclerOnScrollListener 的具体子类实现。

  完整文件在这里

2.2. 使用EndlessRecyclerOnScrollListener

  使用自定义的OnScrollListener,只需使用RecyclerView的addOnScrollListener() 即可:

recyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(layoutManager) {
    @Override
    public void onLoadMore(int current_page) {
        fetchMovies(current_page);
    }
});

这里fetchMovies(current_page) 用于请求第current_page 页的数据。

  完整文件在这里

3. 添加动画效果

  使用ItemAnimator可以为item的添加、移动和移除添加动画效果,有一些很方便的库可以使用,比如recyclerview-animators