XRecyclerView是实现了下拉刷新、滚动到底部加载更多和自定义添加header等多个特点于一身的第三方库,使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater(所以个人感觉使用非常方便)。 加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定。
项目地址:https://github.com/jianghejie/XRecyclerView
效果展示:
首先添加在项目buid.gradle上添加依赖地址
//1.6.0 is the main
implementation 'com.jcodecraeer:xrecyclerview:1.6.0'
创建方式和平常的RecyclerView一样
LinearLayoutManagerlayoutManager=newLinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);
下拉刷新、上拉加载更多:
上拉和下拉都是默认就可以使用的(如果需要关闭该功能需要代码中设置),XRecyclerView中提供一个回调去触发下拉和上拉事件
mRecyclerView.setLoadingListener(newXRecyclerView.LoadingListener() {
@Override
publicvoidonRefresh() {
//refresh data here
}
@Override
publicvoidonLoadMore() {
//load more data here
}
});
1.5.7版本的新功能
mRecyclerView
.getDefaultRefreshHeaderView()//获取默认的头部布局
.setRefreshTimeVisible(true);//展示刷新时间,false为不展示
//if you are not sure that you are 100% going to
//have no data load back from server anymore,do not use this
@Deprecated
public void setEmptyView(ViewemptyView) {
...
}
1.5.6版本新功能,解决内存泄漏问题,使用下面的代码释放XRecyclerView的内存
//any time,when you finish your activity or fragment,call this below
if(mRecyclerView!=null){
mRecyclerView.destroy();//这行代码将完全释放XR的内存
mRecyclerView=null;
}
1.5.3版本新功能,可以在粘性滚动布局使用XR
<com.jcodecraeer.xrecyclerview.StickyScrollLinearLayout
android:id="@+id/StickyScrollLinearLayout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/XRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.jcodecraeer.xrecyclerview.StickyScrollLinearLayout>
finalStickyScrollLinearLayouts=
(StickyScrollLinearLayout) findViewById(R.id.StickyScrollLinearLayout);
s.addOnLayoutChangeListener(
newView.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if(s.getContentView()!=null)
return;
//放在这里是为了等初始化结束后再添加,防止 height 获取 =0
//add from here just in cause they height==0
s.setInitInterface(
newStickyScrollLinearLayout.StickyScrollInitInterface() {
@Override
publicViewsetTopView() {
returntopView;
}
@Override
publicViewsetTabView() {
returntabView;
}
@Override
publicViewsetContentView() {
returncontent;
}
}
);
}
}
通知移除item、通知插入item,记得使用XRecyclerview内部的功能
listData.remove(pos);
mRecyclerView.notifyItemRemoved(listData,pos);
当然当下拉刷新或上拉加载更多结束后,你必须通知RecyclerView,你可以使用
mRecyclerView.loadMoreComplete();//通知上拉加载结束
mRecyclerView.refreshComplete();//通知下拉刷新结束
最好控制一个屏幕中item的数量是集合的长度减2(list.size-2)的时候进行刷新
mRecyclerView.setLimitNumberToCallLoadMore(2);//默认是 1
效果如下:
手动调用刷新(使用refresh() 替代了先前的setRefreshing()方法)
mRecyclerView.refresh();
自定义下拉和上拉的样式style
下拉刷新和上拉加载更多可以更好的自定义
自定义加载样式
使用内置的AVLoadingIndicatorView,在AVLoadingIndicatorView库中提供了所有的效果,此外我们添加了系统样式,你可以使用
mRecyclerView.setRefreshProgressStyle(int style);
mRecyclerView.setLaodingMoreProgressStyle(int style);
分别设置下拉刷新进度样式和上拉加载更多进度样式
下面展示一些常用进度样式效果:
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
mRecyclerView.setLaodingMoreProgressStyle(ProgressStyle.SquareSpin);
BallPulse 效果
在ProgressStyle class中我们可以看到所有的效果,你可以选择自己喜欢的在自己的项目代码中使用
publicclassProgressStyle{
publicstaticfinalintSysProgress=-1;
publicstaticfinalintBallPulse=0;
publicstaticfinalintBallGridPulse=1;
publicstaticfinalintBallClipRotate=2;
publicstaticfinalintBallClipRotatePulse=3;
publicstaticfinalintSquareSpin=4;
publicstaticfinalintBallClipRotateMultiple=5;
publicstaticfinalintBallPulseRise=6;
publicstaticfinalintBallRotate=7;
publicstaticfinalintCubeTransition=8;
publicstaticfinalintBallZigZag=9;
publicstaticfinalintBallZigZagDeflect=10;
publicstaticfinalintBallTrianglePath=11;
publicstaticfinalintBallScale=12;
publicstaticfinalintLineScale=13;
publicstaticfinalintLineScaleParty=14;
publicstaticfinalintBallScaleMultiple=15;
publicstaticfinalintBallPulseSync=16;
publicstaticfinalintBallBeat=17;
publicstaticfinalintLineScalePulseOut=18;
publicstaticfinalintLineScalePulseOutRapid=19;
publicstaticfinalintBallScaleRipple=20;
publicstaticfinalintBallScaleRippleMultiple=21;
publicstaticfinalintBallSpinFadeLoader=22;
publicstaticfinalintLineSpinFadeLoader=23;
publicstaticfinalintTriangleSkewSpin=24;
publicstaticfinalintPacman=25;
publicstaticfinalintBallGridBeat=26;
publicstaticfinalintSemiCircleSpin=27;
}
刷新箭头icon
如果你不喜欢的话也可以使用下面代码替换掉
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
使下拉刷新和上拉加载更多失效
mRecyclerView.setPullRefreshEnabled(false);
或者
mRecyclerView.setPullRefreshEnabled(true);
Viewheader=LayoutInflater.from(this).inflate(R.layout.recyclerview_header, (ViewGroup)findViewById(android.R.id.content),false);
给XRecyclerView添加头部布局,只需调用addHeaderView().
mRecyclerView.addHeaderView(header);
当然你喜欢的话也可以添加多个头部布局
Viewheader=LayoutInflater.from(this).inflate(R.layout.recyclerview_header, (ViewGroup)findViewById(android.R.id.content),false);
Viewheader1=LayoutInflater.from(this).inflate(R.layout.recyclerview_header1, (ViewGroup)findViewById(android.R.id.content),false);
mRecyclerView.addHeaderView(header);
mRecyclerView.addHeaderView(header1);
优化:
XRecyclerView底部默认会有一小段空白区域,因为它本身默认有footView,如果想要去除底部空白可以使用:getDefaultFootView().removeAllViews()方法