SmartRefreshLayout + BaseRecyclerviewAdapterHelper 使用MVP方式实现下拉刷新
关键字:SmartRefreshLayout使用 下拉刷新 上拉加载 BaseRecyclerviewAdapterHelper
前言
下拉刷新和上拉加载是每个APP中最基本的功能,这里将这个功能进行整理。可以作为一个模板代码去使用,这样避免了每次开发都要去思考,直接复制粘贴使用即可。
实现的功能点:
1.使用MVP实现下拉刷新及加载更多;
2.采用懒加载,禁止viewPager预加载,区分出两种刷新:初始化刷新、下拉刷新;
3.采用BaseRecyclerviewAdapterHelper的上拉加载达到更好的上拉加载效果;
4.上拉加载:无数据、加载错误、数据全部加载完成三种视图的区分显示;
5.下拉刷新无数据空视图的展示;
目录
- 技术方案选型
- 具体代码
- 分页字段的理解
利用SmartRefreshLayout实现下拉刷新
利用 baserecyclerviewadapterhelper 实现加载更多
1.Presenter 层,DemoPresenter.java 如下,只列出简要P层获取新闻列表,M层的实现这里就不列出了,这个不是本文重点。
public class DemoPresenter { DemoRepository mRepository; // 获取新闻列表 public void getNews(int pageNumber, int loadType){ mRepository.loadNewsListByTopic(pageNumber, new DemoDataSource.LoadNewsCallback() { @Override public void onNewsLoaded(List<News> newsList) { mView.loadSuccess(newsList, loadType); } }); } }
布局设置
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical"> <!— 这里屏蔽掉加载更多功能 --> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/refreshLayout" android:layout_width=“match_parent" app:srlEnableLoadMore="false" android:layout_height="match_parent"> <!-- 添加经典下拉头部刷新 --> <com.scwang.smartrefresh.layout.header.ClassicsHeader android:layout_width="match_parent" android:layout_height="wrap_content" app:srlAccentColor="@android:color/white" /> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> </ai.botbrain.smartrefresh.layout.SmartRefreshLayout> </LinearLayout>
代码中设置
public class TestFragment extends BaseFragment implements TestView { // 标识分页的字段 private int mPageNum = 0; private static final int COUNT = 10; private int mRefreshType;//mRefreshType变量名用小写,防止看混淆 // 首次刷新 public static final int FIRST_LOAD = 1; // 刷新 public static final int REFRESH = 2; // 上拉加载 public static final int LOAD_MORE = 3; private View mNoDataView; @BindView(R.id.refreshLayout) SmartRefreshLayout mRefreshLayout; @BindView(R.id.recyclerView) PowerfulRecyclerView mRecyclerView; private MyAdapter mAdapter; private MyPresenter mPresenter; @Override public void initData() { super.initData(); mAdapter = new MyAdapter(); // 自定义加载中,加载失败,加载完成的布局 mAdapter.setLoadMoreView(new CustomLoadMoreView()); } @Override public void initView(View rootView) { super.initView(rootView); mNoDataView = getLayoutInflater().inflate(R.layout.empty_view, (ViewGroup) mRecyclerView.getParent(), false); } @Override public void initListener() { super.initListener(); // 下拉刷新回调 mRefreshLayout.setOnRefreshListener(refreshLayout -> { mPageNum = 0; mPresenter.loadDataList(mPageNum, FIRST_LOAD); }); // 上拉加载回调 mAdapter.setOnLoadMoreListener(() -> { mPresenter.loadDataList(mPageNum, LOAD_MORE); }, mRecyclerView); mRecyclerView.setAdapter(mAdapter); // 刚进来的时候来个初始化刷新 mRefreshLayout.autoRefresh(); } @Override public void onLoadNewsSuccess(List<Circle> data, int loadType) { // 防范空指针发生 if (ListUtils.isEmpty(data)) data = new ArrayList<>(); mPageNum++; // int size = data == null ? 0 : data.size(); int size = data.size(); // mRefreshLayout.finishLoadmore(); mRefreshLayout.finishRefresh(0); // 注意:不要忘记添加 break 否则~ switch (loadType) { case FIRST_LOAD: mAdapter.initRefresh(data);// 如果data为null这里就会引发空指针 break; case REFRESH: mAdapter.initRefresh(data); break; case LOAD_MORE: mAdapter.loadMoreData(data); break; } if (mAdapter.getData().size() == 0) { //空视图情况 mAdapter.setEmptyView(noDataView); } else if (size == 0) { //上拉加载出来的数据为0,认为加载结束 mAdapter.loadMoreEnd(false); } else {//完成了本次加载,还有更多数据(注意逻辑是在else中,这里写错可能导致不停的上拉加载数据) mAdapter.loadMoreComplete(); } } // 加载失败的情况,显示重试页面 @Override public void onLoadNewsError() { // 弹出提示 mTipView.show(); // 如果一开始进入没有数据,显示重试布局 if (ListUtils.isEmpty(mAdapter.getData)) { showRetry(); } else { // 显示(加载失败,请点我重试) mAdapter.loadMoreFail(); } // 收起刷新 mRefreshLayout.finishLoadmore(); mRefreshLayout.finishRefresh(0); // 发送加载完成的事件 ... } }
Adapter 中
public class MyAdapter extends BaseMultiItemQuickAdapter<Data, BaseViewHolder> { public MyAdapter() { // 这里传入null具体看源码 super(null); addItemType(Data.TYPE_STYLE_1, R.layout.item_circle_layout); } // 初始化刷新 public void initRefresh(List<Circle> circle) { this.mData.clear(); this.mData.addAll(circle); notifyDataSetChanged(); } // 初始化刷新 public void initRefresh(List<Circle> circle) { this.mData.addAll(circle); notifyDataSetChanged(); } // 普通10条 public void refreshDataNotClear(List<Article> data) { mData.addAll(0, data); notifyDataSetChanged(); } // 加载更多 public void loadMoreData(List<Circle> circle) { this.mData.addAll(circle); notifyDataSetChanged(); } @Override protected void convert(BaseViewHolder helper, Circle item) { int viewType = helper.getItemViewType(); switch (viewType) { case Article.TYPE_LK_LANDSCAPE: renderBanner(helper, item); break; case : break; } }
实体类
public class New implements MultiItemEntity { public static final int TYPE_ONE_PIC = 100; private int itemType; public void setItemType(int itemType) { this.itemType = itemType; } @Override public int getItemType() { return itemType; } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
android8.0采坑 Only fullscreen opaque activities can request orientation
android8.0采坑 Only fullscreen opaque activities can request orientation 也就是说只有全屏不透明的activity才可以设置方向,既然知道问题所在就好办了。 找到你设置透明的Activity,然后在他的theme中加入如下配置。 <item name="android:windowIsTranslucent">false</item> <item name="android:windowDisablePreview">true</item> 但是我的项目使用的是第三方的库com.ycjiang:imgepreviewlibrary:1.1.3 之前使用点击图片预览大图imgepreviewlibrary都是一次性成功的,但是今天在新的产品上使用,却一直报错,无语。没办法只能自定义activity了。 1.我们自定义一个activity, ImageLookActivity public class ImageLookActivity extends GPreviewAct...
- 下一篇
xcode 使用笔记
最近做个 IM 相关的项目,为了搞个开源的 IOS 版本,因此开启了 XCode 开发使用 遇见了如下几点问题 环境说明 Mac macOS High Sierra. 版本 10.13.6 XCode Version 9.4.1 (9F2000) 1. Pod 在 Java 的世界呆时间长了,习惯了 mvn, ant 等内容, Pod 可以认为是 ios 下的 mvn 用来管理依赖包,类似 mvn 或其他的工具类似,它有自己独立的命令,如下所示 引用于 pod命令汇总: pod 命令列表 如需要进一步了解其使用,可以参见 pod <cmd> --help 进行查看, 比如: pod install --help 2. llvm 控制台 进入 llvm 控制台的方式有两种: 调试模式下进入到断点或Pause执行程序 发生异常错误 当进入到 llvm 控制台之后,可以进行如下操作: # 常见的 po 命令,用于打印对象内容 # 比如 打印当前模拟器运行时生成的工程文件位置 (llvm) po NSHomeDirectory() "/Users/mac/Library/Devel...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器