RecyclerView使用方法举例(2)
本文紧接着RecyclerView使用方法举例(1),继续介绍RecyclerView的一些用法。
Contents
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。