简介
使用SmartRefreshLayout,实现下拉刷新,上拉加载效果。
流程
1. 引入依赖
此处只引用核心依赖,经典布局,更多上拉下拉动画效果可参考仓库GitHub SmartRefreshLayout
implementation 'com.scwang.smart:refresh-layout-kernel:2.0.3'
implementation 'com.scwang.smart:refresh-header-classics:2.0.3'
如果使用 AndroidX 需要先在 gradle.properties 中添加
android.useAndroidX=true
android.enableJetifier=true
2. 建立布局
ClassicsHeader为下拉后的布局,ClassicsFooter为上拉时下方的布局,本文均采用经典布局。
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="500dp">
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_log"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:itemCount="50"
tools:listitem="@layout/item_log" />
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
3. 实现逻辑
SmartRefreshLayout refreshLayout = dialog.findViewById(R.id.refreshLayout);
//实现下拉刷新 (此处借助了rxutil2实现IO操作后更新UI操作:RxJavaUtils.executeAsyncTask())
refreshLayout.setOnRefreshListener(refreshlayout -> RxJavaUtils.executeAsyncTask(new RxAsyncTask<Object, List<Log>>(null) {
@Override
public List<Log> doInIOThread(Object o) {
//耗时操作:数据刷新
return 数据;
}
@Override
public void doInUIThread(Log 数据) {
//数据加载至RecycleView
adapter.setDataList(数据);
notifyDataSetChanged();
//结束SmartRefreshLayout刷新动画
refreshlayout.finishRefresh();
}
}));
//实现上拉加载更多
refreshLayout.setOnLoadMoreListener(refreshlayout -> RxJavaUtils.executeAsyncTask(new RxAsyncTask<Object, List<Log>>(null) {
@Override
public List<Log> doInIOThread(Object o) {
//耗时操作:数据加载
return 数据;
}
@Override
public void doInUIThread(Log 数据) {
//数据加载至RecycleView
adapter.setDataList(数据);
notifyDataSetChanged();
//结束SmartRefreshLayout刷新动画
if (数据.size() == 0) {
refreshlayout.finishLoadMoreWithNoMoreData();
} else {
refreshlayout.finishLoadMore();
}
}
}));