JDRefresh 轻简下拉刷新框架
现在网上有很多 RecyclerView 相关框架,我用过的
BaseRecyclerViewAdapterHelper、 LRecyclerView、 SmartRefreshLayout 等等
这几个主流框架基本上都已经非常成熟,而且在github的star量也很多,有兴趣的同学可以关注学习一下。
可能有人会问,既然网上有这么多的开源框架,为什么还写 JDRefresh。
首先对我来说,自己撸一个框架,是一个不断学习的过程。
而且在这个过程中,你会遇到很多之前你没有遇见过的错误,
对代码的理解也会更深一层,是一个很好的知识技能提升的机会。
因此,心生自撸框架的想法,那么就有了今天的主角:JDRefresh.
功能点
- 支持设置下拉刷新头,上拉加载布局
- 支持上拉加载
- 支持添加 HeaderView
- 支持添加 FooterView
- 支持自动刷新、自动上拉加载
- 支持多布局
- 支持添加 item 点击事件
- 上拉加载失败,支持点击重新加载
- 侧滑删除
jdRefresh.fixedSize()
.layoutManagerLinear()
.dragRate(3.5f)
.refreshEnabled(true)
.loadMoreEnabled(true)
.refreshHeader(refreshHeader)
.loadMoreFooter(loadMoreFooter)
.headerView(headerView)
.footerView(footerView)
.refreshListener(this)
.loadMoreListener(this)
.autoLoadMoreEnabled(true)
.autoRefresh().adapter(mAdapter);
复制代码
是不是感觉很代码很清爽?那么接下来看一下具体如何使用。
框架引入
如何使用?
- Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
复制代码
- Add the dependency
dependencies {
implementation 'com.github.JD-CP:JDRefresh:1.0.0-beta'
}
复制代码
自定义下拉刷新头
可随心所欲配置你想实现的下拉刷新头!!!
示例代码:
public class ExsampleRefreshHeader extends RefreshHeader {
public ExsampleRefreshHeader(Context context) {
super(context);
}
/**
* 初始化 Header,具体代码可参考 DefaultRefreshHeader
*/
@Override
protected void initHeader() {
}
@Override
public void stateChanged(int state) {
}
@Override
public View getHeaderView() {
return this;
}
}
jdRefresh.setRefreshHeader(new ExsampleRefreshHeader(this));
复制代码
自定义上拉加载布局
public class ExsampleLoadMoreFooter extends LoadMoreFooter {
public ExsampleLoadMoreFooter(Context context) {
super(context);
}
/**
* 初始化 Header,具体代码可参考 DefaultRefreshHeader
*/
@Override
protected void initFooter() {
}
@Override
public void stateChanged(int state) {
}
@Override
public View getFooterView() {
return this;
}
}
jdRefresh.setLoadMoreFooter(new ExsampleLoadMoreFooter(this));
复制代码
添加 or 删除 HeaderView、FooterView
// 添加
jdRefresh.headerView(header);
jdRefresh.footerView(footer);
// 删除
jdRefresh.headerViewRemoved(header);
jdRefresh.footerViewRemoved(footer);
复制代码
设置下拉刷新监听器、上拉加载监听器
// 方式 1 此种已不推荐使用,看 方式 2
jdRefresh.setRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
// TODO
}
});
jdRefresh.setLoadMoreListener(new OnLoadMoreListener() {
@Override
public void loadMore() {
// TODO
}
});
// 方式 2
jdRefresh.refreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
// TODO
}
});
jdRefresh.loadMoreListener(new OnLoadMoreListener() {
@Override
public void loadMore() {
// TODO
}
});
复制代码
设置进入页面自动刷新
jdRefresh.autoRefresh();
复制代码
上拉加载
默认支持上拉加载,若禁用上拉加载,可以配置:
jdRefresh.loadMoreEnabled(false);
复制代码
默认支持自动上拉加载,若禁用,可以配置:
// true:开启 false:关闭 默认为 true
jdRefresh.autoLoadMoreEnabled(boolean isAutoLoadMore);
复制代码
支持设置上拉加载布局高度:
jdRefresh.loadMoreFooterHeight(int height);
复制代码
上拉加载完成(当前页数据加载完成,下一页还有数据可加载):
// 方式 1:
jdRefresh.loadMoreCompleted();
// 方式 2:
jdRefresh.noMoreData(false);
复制代码
上拉加载结束(没有下一页,也就是说下一页无数据可加载):
jdRefresh.noMoreData(true);
复制代码
加载失败配置(出现加载失败,点击会出重新加载,无需配置点击事件):
jdRefresh.loadMoreFail();
复制代码
多布局列表加载
注意:实体类必须要实现 MultiItemEntity
public class MultiSample implements MultiItemEntity {
public static final int TYPE_NORMAL = 101;
public static final int TYPE_OTHER = 102;
private int type;
public int getType() {
return type;
}
public int setType(int type) {
this.type = type;
}
@Override
public int getItemType() {
return type;
}
}
复制代码
然后在 adapter 构造方法中,根据 type 添加相对应的 layout
public class SampleMultiAdapter extends JDMultiItemAdapter<MultiSample> {
public SampleMultiAdapter(Context context, List<MultiSample> dataList) {
super(context, dataList);
addItemType(MultiSample.TYPE_NORMAL, R.layout.item_multi_normal);
addItemType(MultiSample.TYPE_OTHER, R.layout.item_multi_other);
}
@Override
protected void bind(JDViewHolder holder, MultiSample item, int position) {
switch (item.getItemType()) {
case MultiSample.TYPE_NORMAL:
// 赋值操作
break;
case MultiSample.TYPE_OTHER:
// 赋值操作
break;
}
}
}
复制代码
添加 item 点击事件
// item 点击事件
mAdapter.setOnItemClickListener(new JDAdapter.OnItemClickListener() {
@Override
public void onItemClick(JDAdapter adapter, View view, int position) {
}
});
// item child 点击事件
mAdapter.setOnItemChildClickListener(new JDAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(JDAdapter adapter, View view, int position) {
}
});
复制代码
设置 LayoutManager
之前设置 LayoutManager 需要:
LinearLayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
复制代码
现在只需:
jdRefresh.layoutManagerLinear();
复制代码
还有:
jdRefresh.layoutManagerLinear(orientation, reverseLayout);
jdRefresh.layoutManagerGrid(spanCount);
jdRefresh.layoutManagerGrid(spanCount, orientation, reverseLayout);
jdRefresh.layoutManagerStaggeredGrid(spanCount, orientation);
复制代码
侧滑删除
布局文件编写:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#ffffff">
<com.jd.library.ui.SwipeDeleteMenu
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="12dp"
android:paddingLeft="15dp"
android:paddingTop="12dp">
<TextView
android:layout_width="80dp"
android:layout_height="50dp"
android:background="#575757" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<TextView
android:id="@+id/item_type"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="JDRefresh - Normal - No1"
android:textSize="13sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="bottom"
android:text="JD厂牌" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom"
android:text="2020-08-08" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/btnDelete"
android:layout_width="60dp"
android:layout_height="match_parent"
android:background="#ff4a57"
android:text="删除"
android:textColor="@android:color/white" />
</com.jd.library.ui.SwipeDeleteMenu>
</LinearLayout>
复制代码
然后在 adapter 中绑定事件:
@Override
protected void bind(JDViewHolder holder, String item, int position) {
holder.text(R.id.item_type, item)
.clickListener(R.id.btnDelete);
}
复制代码
然后实现 itemChildClick 点击事件:
mAdapter.setOnItemChildClickListener(new JDAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(JDAdapter adapter, View view, int position) {
adapter.removeItem(position);
}
});
复制代码
侧滑删除具体的实现过程,我已上传到博客。 点击下方可以进行查看: SwipeDeleteMenu
目前 JDRefresh 已实现上述功能,接下来还会拓展更多功能,
比如置顶(仿微信),添加拖拽等等。 当然,这里面也有诸多不足,希望各位网友提出。
这个项目也会持续不断的维护下去。
更新记录
-
1.2.6-beta
更新下拉刷新样式 -
1.2.5-beta
- HeaderView、FooterView 添加逻辑优化
- HeaderView、FooterView 删除功能添加
- JDRefresh 类代码优化以及部分 bug 修复
-
1.2.0-beta
自定义仿微信看一看下拉刷新动画 -
1.1.0-beta:
增加 list item 侧滑删除。
THANKS
BaseRecyclerViewAdapterHelper、
LRecyclerView、
SmartRefreshLayout
联系方式
- 有问题可以添加我微信,我很乐意帮您解决问题,也很希望能与您一起探讨学习