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。